使用 Java 创建的 ZIP 文件在使用 Windows 资源管理器打开时显示为空

Posted

技术标签:

【中文标题】使用 Java 创建的 ZIP 文件在使用 Windows 资源管理器打开时显示为空【英文标题】:ZIP file created using Java showing empty when open with Windows Explorer 【发布时间】:2014-05-19 10:11:58 【问题描述】:

以下代码用于压缩普通文本文件。当我使用 WinRaR 提取时,它会正确显示内容,但是当我使用 Windows 资源管理器打开它时,它是空的,没有列出任何文件。我使用的是 Windows 7 Enterprise(64 位)操作系统。知道为什么它没有在 Windows 资源管理器中列出吗?提前致谢。

File file = new File("F:\\sample.txt");
    byte[] buf = new byte[1024];
    String outFilename = "F:\\zipped_sample.zip";
    try 
      ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));
      FileInputStream in = new FileInputStream(file);
      out.putNextEntry(new ZipEntry(file.toString()));
      int len;
      while ((len = in.read(buf)) > 0) 
        out.write(buf, 0, len);
        out.flush();
      
      out.closeEntry();
      out.close();
      in.close();
     catch (Exception e) 
      // log exception here
    

【问题讨论】:

这段代码应该可以正常工作,Windows 资源管理器应该显示压缩包中包含“F:”条目和“sample.txt”条目。在catch 中正确记录异常,以查看此代码是否在您的计算机上正常完成。 你应该 close() 在 finally 块中。此外,如果这是 Java 7,请使用新的 zip 文件系统,它会让您的工作更轻松。 @OlegEstekhin 代码正常完成,我没有看到任何错误/异常。但是当我尝试右键单击-> 全部提取时,会显示错误“Windows 无法完成提取。压缩(压缩)文件夹无效”。我不知道为什么它只在 Windows 资源管理器中失败。 在 7-Zip 或其他专用 ZIP 文件软件中打开它。似乎 Windows 资源管理器无法处理名为“F:”的条目,无论是在列出内容时,尤其是在提取它们时,因为“F:”在 Windows 上不是有效的文件名。 @OlegEstekhin,是的,你是对的,我只是将代码更改为 out.putNextEntry(new ZipEntry(file.getName()));而不是 out.putNextEntry(new ZipEntry(file.toString()));现在 Windows 资源管理器可以显示内容了。 【参考方案1】:

ZipEntry 构造函数采用名称,但您通过执行 file.toString(); 为其提供路径试试:

New ZipEntry(file.getName());

这将传递文件名。

【讨论】:

【参考方案2】:

我有同样的问题 zip 文件未解压缩并显示为空,问题出在 zip 文件中的文件夹名称中。如果文件夹名称由> or < 符号组成,我看到了失败。所以在代码new ZipEntry(file.toString()) 中,我尝试用这些特定符号清理任何文件夹名称

【讨论】:

以上是关于使用 Java 创建的 ZIP 文件在使用 Windows 资源管理器打开时显示为空的主要内容,如果未能解决你的问题,请参考以下文章

Powershell 创建不同的 Zip 文件?

如何使用密码创建 zip 文件

使用 Java 创建的 ZIP 文件在使用 Windows 资源管理器打开时显示为空

如何移动使用 Java.NIO FileSystem 创建的 .zip 文件夹

如何在创建它之前在java中估计zip文件的大小

如何使用java压缩文件夹成为zip包