我使用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
我需要在7Zip地址栏中输入C:\temp\text.zip\\\temp\
。注意这里的双反斜杠\\\
。
以下是我的代码:
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。
答案 0 :(得分: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:"
部分不可移植。)