不解压直接获取压缩包里面的部分文件

 最近做项目遇到个问题:

1.一个压缩包里面获取部分文件;

2.需要获取的文件从一个TXT文件里面读取;

   我首先想到的就是直接解压再进行遍历比较获取,不过仔细想一想发现这种操作会耗时间。

另外解压出来以后不需要的部分还得进行删除处理。所以写出了直接获取文件的方法,先获取压缩包里面的文件列表,

再进行匹配,匹配成功就读数据写到文件

具体代码如下:

 1 package protect;
 2 
 3 import java.io.*;
 4 import java.nio.file.Files;
 5 import java.util.HashSet;
 6 import java.util.List;
 7 import java.util.zip.*;
 8 public class zip_unzip {
 9     public static void main(String[] args) throws Exception {
10         String  descDir="E:/123";//输出地址
11         String  zipPath = "E:/123.zip";//需要解压的压缩文件
12         String txtfile="E:/123.txt";//匹配表
13         ZipInputStream zis = new ZipInputStream(new FileInputStream(zipPath));//输入流
14         FileOutputStream fios =null;
15         ZipEntry ze = null;//create an entry
16         ZipFile zipfile =new ZipFile(zipPath);
17         String name = zipfile.getName().substring(zipfile.getName().lastIndexOf('\\') + 1, zipfile.getName().lastIndexOf('.'));//获取路径
18         File pathFile = new File(descDir +"/"+name);
19             if (!pathFile.exists()) {
20                 pathFile.mkdirs();//创建文件夹
21             }
22         //一次性读取全部文件
23         List<String> lines = Files.readAllLines(new File(txtfile).toPath());
24         HashSet<String> reslist_list = new HashSet<>(lines);
25         while ((ze = zis.getNextEntry()) != null) {
26             String zislist=ze.getName();
27             InputStream in = zipfile.getInputStream(ze);
28             byte data[] = null;
29             //System.out.println("-----"+zislist+"-----");
30             //判断是否在txt里面出现
31             if (reslist_list.contains(zislist)) {
32                 File outFile = new File((descDir + "/" + name + "/" + zislist).replaceAll("\\\\", "/"));
33                 outFile.getParentFile().mkdirs();//创建文件夹
34                 System.out.println("["+zislist+"] found in the 123.txt,write into data!");
35                 fios =new FileOutputStream(outFile);
36                 System.out.println("outfile is : "+outFile);
37                 byte buff[] = new byte[1024];
38                 int length = -1;
39                 while ((length = in.read(buff, 0, buff.length)) > 0) {
40                     fios.write(buff, 0, length);
41                 }
42             } else {
43                 System.out.println(zislist+" not found in the 123.txt,dropped!");
44                 continue;//不在txt里面则继续读下一条
45             }
46         }
47         //关闭输入流
48         zis.closeEntry();
49         zis.close();
50         //关闭输出流
51         fios.flush();
52         fios.close();
53         System.out.println("-----completed!-----");
54     }
55 }

 

posted @ 2018-01-28 22:45  小天犬  阅读(2497)  评论(0编辑  收藏  举报