最近做项目遇到个问题:
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 }