如何使用Java压缩/升级文件夹及其所有文件和子目录?

如何使用Java压缩/升级文件夹及其所有文件和子目录?,java,file,compression,directory,zipfile,Java,File,Compression,Directory,Zipfile,我读这篇文章是为了学习如何使用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 Met

我读这篇文章是为了学习如何使用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)
java.io.FileNotFoundException:assets(访问被拒绝)//assets是我试图压缩的文件夹的名称
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(未知源)
位于java.io.FileInputStream。(未知源)
位于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();
      }
   }
} 
import java.io.*;
导入java.util.zip.*;
公共类邮政编码{
静态最终整数缓冲区=2048;
public-void-zip(){
试一试{
BufferedInputStream原点=null;
FileOutputStream dest=新建
FileOutputStream(“H:\\myfigs.zip”);
CheckedOutputStream校验和=新
CheckedOutputStream(dest,new Adler32());
ZipOutputStream out=新
ZipOutputStream(纽约州)
缓冲输出流(校验和);
//out.setMethod(ZipOutputStream.DEFLATED);
字节数据[]=新字节[缓冲区];
//从当前目录获取文件列表
文件f=新文件(“.”);
字符串文件[]=f.list();

对于(int i=0;i,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)

以下是该问题的解决方案:

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)

这里有一个问题的解决方案:

状态…目录条目被定义为名称以“/”结尾的条目,当向Zip文件添加条目时,您只需在条目名称中添加尾随斜杠,不需要添加任何内容,只需添加条目。非常感谢,这对我帮助很大。@MadProgrammer说得很好-如果y您正试图让zip存档重新创建一个空文件夹,您确实需要插入一个文件夹名以正斜杠结尾的ZipEntry,并且不添加内容。状态…目录项定义为名称以“/”结尾的目录项,在向zip文件添加项目时,您只需要在条目名中添加尾随斜杠,即可不需要添加任何内容,只需输入谢谢,这对我帮助很大。@MadProgrammer说得很好-如果您试图让zip存档重新创建一个空文件夹,您需要插入一个ZipEntry,文件夹名称以正斜杠结尾,并且不要添加内容。