2014-01-07 26 views
6

我正在嘗試開發可處理非英文字符(變音符號,阿拉伯語等)壓縮文件的代碼,但壓縮文件包含不正確的名稱。我正在使用java版本1.7.0_45因此它不應該是由於提到的錯誤here。我將字符集設置爲UTF-8的ZipOutputStream構造函數,按照Javadocs它應該按照我的要求工作。即使使用Java編寫包含非英文字符的文件名時不正確的壓縮條目7

我確信壓縮文件正在被正確寫入,因爲試圖從文件中讀取條目給出正確的文件名(如預期的那樣)。

但是,當我嘗試用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

你確定的解壓縮工具,您使用的是能夠處理您的文件名中的字符? –

+0

是的。如前所述,默認的ubuntu歸檔管理器和解壓縮工具都能夠分別壓縮/解壓縮文件。但是,我的代碼創建的文件名稱混亂了。 –

+0

我遇到了一個解決方法,我使用'ProcessBuilder'來創建zip。但是,這不是一個非常有效的方法。有沒有人能夠解決它與Java? –

回答

2

[更新] 我終於明白,問題不在代碼中,而實際上與Ubuntu的默認ArchiveManager相同。它不能正確識別/提取內容。當相同的文件被windows zip處理程序打開/提取時,它可以完美地工作。

此外,commons-compress支持一堆與Java支持的zip,gzip不同的格式。

http://commons.apache.org/proper/commons-compress/index.html

相關問題