3

我正在使用 Java 压缩 API(java.util.ZIP 包)来压缩文件。它运作良好。但是,我有以下小问题。

假设我的输入文件是C:\temp\text.txt并且我的输出(压缩)文件是C:\temp\text.zip

当我使用 WinZip 查看压缩文件 (text.zip) 时,它会正确显示内部文件夹结构。它显示为temp\text.txt。但是,如果使用 7Zip 打开相同的文件(使用右键单击 -> 7Zip -> 打开存档选项),它会在C:\temp\text.zip\. 要查看text.txt我需要C:\temp\text.zip\\\temp\在 7Zip 地址栏中输入。注意这里的双反斜杠\\\

下面是我的代码:

String input="C:\temp\text.txt";
String output="C:\temp\text.zip";
FileOutputStream dest = new FileOutputStream(output);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
out.setMethod(ZipOutputStream.DEFLATED); //Entries can be added to a ZIP file in a compressed (DEFLATED) form 
out.setLevel(this.getZIPLevel(Deflater.DEFAULT_COMPRESSION));

File file = new File(input);
final int BUFFER = 2048;
byte data[] = new byte[BUFFER];
BufferedInputStream origin = null;
FileInputStream fi;

fi = new FileInputStream(file);
origin = new BufferedInputStream(fi, BUFFER);

int index = file.getAbsolutePath().indexOf(":") + 1;
String relativePath = file.getPath().substring(index);

ZipEntry entry = new ZipEntry(relativePath);
out.putNextEntry(entry);
int count;
while((count = origin.read(data, 0, BUFFER)) != -1) {
      out.write(data, 0, count);
}
origin.close();
out.close();

有人能告诉我为什么我看到使用 7Zip 的额外空文件夹吗?我正在使用JDK7。

4

1 回答 1

1

对于初学者,请尝试解决此问题:

String input = "C:\\temp\\text.txt";
String output = "C:\\temp\\text.zip";

请注意,您需要转义\字符串中的字符。鉴于这"\t"是一个有效的转义序列,它可能以前也有效,但名称中间有几个制表符。为了避免需要转义路径分隔符,你可以这样写:

String input = "C:/temp/text.txt";
String output = "C:/temp/text.zip";

为了使其更便携,您可以同时替换"\\""/"File.separator这是一个常量,它为您的环境保存正确的系统相关名称分隔符("C:"尽管该部分不可移植。)

于 2012-05-29T10:25:34.037 回答