1.ZipInputStream是一種FilterInputStream
- 能夠直接讀取zip的內容
- InputStream->FilterInputStream->InflateInputStream->ZipInputStream->JarInputStream
- JarInputStream使用ZipInputStream派生出來的,能夠直接讀取jar文件的MANIFEST.MF文件
ZipInputStream的基本用法:java
try(ZipInputStream zip = new ZipInputStream()...){ ZipEntry entry = null; while((entry=zip.getNextEntry())!=null){//getNextEntry返回null,zip流結束 String name = entry.getName();//每個entry都表示一個壓縮文件或者目錄 if(!entry.isDirectory()){ int n; while((n=zip.read()) != -1){...}//若是entry是壓縮文件,就不斷讀取,直到返回-1 } } }
<font color=#FF0000>問題:爲何read()傳入的zip,不是entry?zip流是按照單個文件讀取的。Entry表明當前文件或目錄,zip.read()讀取返回-1,當前entry結束,開始下一個entry。</font> <img src="https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190405214341887-1840040120.jpg" width="500" />spa
2.ZipOutputStream是一種FilterOutputStream
- 能夠直接寫入Zip的內容
try(ZipOutputStream zip = new ZipOutputStream(...)){ File[] files = ... for(File file:files){ zip.putNextEntry(new ZipEntry(file.getName()));//未考慮文件目錄的層次結構;若是考慮層次結構,傳入的name須要使用相對路徑 zip.write(getFilterDataAsBytes(file));//寫入byte數據 zip.closeEntry();//結束這個文件的打包 } } ## 3.示例 ```#java public class Main { public static void main(String[] args) throws IOException { try(//須要調用ZipInputStream的getNextEntry(),所以沒有將zip轉型爲InputStream ZipInputStream zip = new ZipInputStream( new BufferedInputStream( new FileInputStream("./src/main/java/com/testList/agent.jar")))){ ZipEntry entry = null; while((entry=zip.getNextEntry())!=null){ if(entry.isDirectory()){ System.out.println("D "+entry.getName()+"\t"+entry.getSize()); }else{ System.out.println("F "+entry.getName()+"\t"+entry.getSize());//打印entry的大小 printFileContent(zip); } } } } static void printFileContent(ZipInputStream zip) throws IOException{ ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int n = 0; while((n=zip.read(buffer))!=-1){ output.write(buffer,0,n); } byte[] data = output.toByteArray(); System.out.println(" size:"+data.length); } }
<img src="https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190405214430240-904148881.png" width="500" />code
4.總結:
- ZipInputStream能夠讀取Zip格式的流
- ZipOutputStream能夠把數據寫入Zip
- ZipInputStream/ZipOutputStream都是FilterInputStream/FilterOutputStream
- 配合FileInputStream和File OutputStream就能夠讀寫Zip文件