廖雪峯Java6 IO編程-2input和output-5操做zip

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文件
相關文章
相關標籤/搜索