使用 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 资源管理器打开时显示为空的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 创建的 ZIP 文件在使用 Windows 资源管理器打开时显示为空