最近做項目遇到個問題:
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 }