簡體   English   中英

如何使用Java對文件夾及其所有文件和子目錄進行zip / upzip?

[英]How to zip/upzip a folder and all of its files and subdirectories using Java?

我正在閱讀本文,以了解如何使用Java壓縮/解壓縮文件。 我用來指導我,將所有文件壓縮到一個文件夾中時效果很好,但是當我使用其中包含更多文件夾的文件夾對其進行測試時,它不起作用,它引發了以下錯誤:

java.io.FileNotFoundException: assets (Access is denied) //assets is the name of the folder I tried to zip
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at Zip.main(Zip.java:24)

這是我正在使用的類,您將看到它是相同的代碼示例4:上一個鏈接中的Zip.java類代碼:

import java.io.*;
import java.util.zip.*;

public class Zip {
   static final int BUFFER = 2048;
   public void zip() {
      try {
         BufferedInputStream origin = null;
         FileOutputStream dest = new 
           FileOutputStream("H:\\myfigs.zip");
         CheckedOutputStream checksum = new 
           CheckedOutputStream(dest, new Adler32());
         ZipOutputStream out = new 
           ZipOutputStream(new 
             BufferedOutputStream(checksum));
         //out.setMethod(ZipOutputStream.DEFLATED);
         byte data[] = new byte[BUFFER];
         // get a list of files from current directory
         File f = new File(".");
         String files[] = f.list();

         for (int i=0; i<files.length; i++) {
            System.out.println("Adding: "+files[i]);
            FileInputStream fi = new 
              FileInputStream(files[i]);
            origin = new 
              BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(files[i]);
            out.putNextEntry(entry);
            int count;
            while((count = origin.read(data, 0, 
              BUFFER)) != -1) {
               out.write(data, 0, count);
            }
            origin.close();
         }
         out.close();
         System.out.println("checksum: "+checksum.getChecksum().getValue());
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
} 

應該進行哪些更改,以便此代碼可以將文件夾內的文件夾及其所有文件壓縮為zip文件?

zip條目需要指定檔案內部文件的路徑。 您不能將文件夾添加到zip存檔中-您只能在該文件夾中添加文件。

命名約定是使用正斜杠作為路徑分隔符。 如果要使用以下文件/子目錄壓縮文件夾:

c:\foo\bar\a.txt
c:\foo\bar\sub1\b.txt
c:\foo\bar\sub2\c.txt

zip條目名稱為:

a.txt
sub1/b.txt
sub2/c.txt

因此,要修復算法,請在for循環內添加isDirectory(),然后以遞歸方式將任何子目錄中的文件添加到zip中。 可能最好的方法是有一個方法:

addDirectoryToZip(String prefix, File directory, ZipOutputStream out)

這是該問題的解決方案: java.util.zip-重新創建目錄結構

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM