我正在尝试开发能够处理非英文字符(变音符号,阿拉伯语等)的压缩文件的代码,但压缩文件包含不正确的名称。我使用 java版本1.7.0_45 因此它不应该是由于here提到的错误。我正在为ZipOutputStream
构造函数将字符集设置为UTF-8根据Javadocs,它应该按照我的要求工作。
我确信zip文件正在正确写入,因为尝试从文件中读取条目会提供正确的文件名(如预期的那样)。
但是,当我尝试使用Ubuntu默认的ArchiveManager / Unzip工具打开/解压缩时,文件名会混乱。
这是我的代码:
private void convertFilesToZip(List<File> files) {
FileInputStream inputStream = null;
try {
byte[] buffer = new byte[1024];
FileOutputStream fileOutputStream = new FileOutputStream("zipFile.zip");
ZipOutputStream outputStream = new ZipOutputStream(fileOutputStream, Charset.forName("UTF-8"));
for (File file : files) {
inputStream = new FileInputStream(file);
String filename = file.getName();
System.out.println("Adding file : " + filename);
outputStream.putNextEntry(new ZipEntry(filename));
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.closeEntry();
}
if(inputStream != null) inputStream.close();
outputStream.close();
System.out.println("Zip created successfully");
System.out.println("=======================================================");
System.out.println("Reading zip Entries");
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File("zipFile.zip")), Charset.forName("UTF-8"));
ZipEntry zipEntry;
while((zipEntry=zipInputStream.getNextEntry())!=null){
System.out.println(zipEntry.getName());
zipInputStream.closeEntry();
}
zipInputStream.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}
文件的输出如下:
Adding file : umlaut_ḧ.txt
Adding file : ذ ر ز س ش ص ض.txt
Adding file : äǟc̈ḧös̈ ẗǚẍŸ_uploadFile4.txt
Adding file : pingüino.txt
Adding file : ÄÖÜäöüß- Español deEspaña.ppt
Zip created successfully
=======================================================
Reading zip Entries
umlaut_ḧ.txt
ذ ر ز س ش ص ض.txt
äǟc̈ḧös̈ ẗǚẍŸ_uploadFile4.txt
pingüino.txt
ÄÖÜäöüß- Español deEspaña.ppt
有没有人成功实现了我希望在这里实现的目标。
有人能指出我可能错过的或者做错了。我做了所有谷歌我甚至尝试了Apache Commons Compress
但仍然没有运气。
在错误报告中提到错误已在Java 7中解决,那么为什么代码无效。
答案 0 :(得分:3)
[更新] 我终于发现问题不在代码中,而实际上是Ubuntu的默认ArchiveManager。它无法正确识别/提取内容。当Windows zip处理程序打开/提取相同的文件时,它可以完美地运行。
此外,commons-compress除了支持Java的zip,gzip外,还支持一堆其他格式。
http://commons.apache.org/proper/commons-compress/index.html