Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 压缩文件中出现的文件路径_Java_File_Zip - Fatal编程技术网

Java 压缩文件中出现的文件路径

Java 压缩文件中出现的文件路径,java,file,zip,Java,File,Zip,我有一个java程序,如下所示,用于将文件夹压缩为一个整体 public static void zipDir(String dir2zip, ZipOutputStream zos) { try { File zipDir= new File(dir2zip); String[] dirList = zipDir.list(); byte[] readBuffer = new byte[2156];

我有一个java程序,如下所示,用于将文件夹压缩为一个整体

public static void zipDir(String dir2zip, ZipOutputStream zos) 

{ 

try 

{ 

           File zipDir= new File(dir2zip); 

            String[] dirList = zipDir.list(); 

          byte[] readBuffer = new byte[2156]; 

          int bytesIn = 0; 

      for(int i=0; i<dirList.length; i++) 

       { 

         File f = new File(zipDir, dirList[i]); 

      if(f.isDirectory()) 

      { 

                    String filePath = f.getPath(); 

           zipDir(filePath, zos); 

         continue; 

     } 

          FileInputStream fis = new FileInputStream(f); 

            ZipEntry anEntry = new ZipEntry(f.getPath()); 

                zos.putNextEntry(anEntry); 

       while((bytesIn = fis.read(readBuffer)) != -1) 

       { 

           zos.write(readBuffer, 0, bytesIn); 

        } 

      fis.close(); 

    } 

} 

catch(Exception e) 

{ 

 e.printStackTrace();

} 


}

public static void main(){
String date=new java.text.SimpleDateFormat("MM-dd-yyyy").format(new java.util.Date());

         ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("Output/" + date + "_RB" + ".zip"));

         zipDir("Output/" + date + "_RB", zos); 

         zos.close();
}
publicstaticvoidzipdir(字符串dir2zip,ZipOutputStream zos)
{ 
尝试
{ 
File zipDir=新文件(dir2zip);
字符串[]dirList=zipDir.list();
字节[]读取缓冲区=新字节[2156];
int字节数=0;

对于(int i=0;i而言,其发生是因为:

ZipEntry anEntry=新的ZipEntry(f.getPath())

f.getPath()
将在字符串开头返回
Output/
。这是由于程序的流程以及它(mis)如何使用文件对象造成的

我建议您构造一个名为tmp的文件对象,比如说,
tmp

File tmp = new File(dirList[i]);
更改
f
的结构:

File f = new File(zipDir, tmp.getPath());
然后,更改此选项:

ZipEntry anEntry = new ZipEntry(f.getPath());
为此:

ZipEntry anEntry = new ZipEntry(tmp.getPath());

我没有时间实际测试它,但简而言之,您的问题在于文件对象是如何构造的。

现在,发生这种情况是因为您没有在ZIP中包含目录项。请将此添加到
f.isDirectory()
条件:
zos.putnextry(新的ZipEntry(filePath))
。对不起,我找不到Isaac!你能简单地解释一下吗?“更简单”意味着“更少的细节”。创建ZIP文件不仅要添加文件的内容,还要添加“条目”对于文件。这就是
putnextry
所做的;它实际上并没有添加文件的内容-它添加了正确的ZIP头。您对文件执行了此操作,所以您也需要对目录条目执行此操作。