2014-01-07 4 views
6

英語以外の文字(Umlaut、アラビア語など)でファイルを圧縮できるコードを開発しようとしていますが、私はjavaバージョン1.7.0_45を使用しています。したがって、というバグが原因ではありません。ZipOutputStreamコンストラクタの場合、charsetをUTF-8に設定しています。Java 7でも英語以外の文字が含まれているファイルを書き込んだときのジップ入力が間違っています

ファイルからのエントリを読み取ろうとすると、(期待通りに)適切なファイル名が与えられるため、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 

は、誰もが成功し、私がここに実現したいものを実装しました。 誰かが私が逃したかもしれない、または間違っていたかもしれないことを私に指摘することはできますか?私はできるだけ多くのgoogleをしたし、Apache Commons Compressでも試しました。

Java 7でバグが解決されたというバグレポートに記載されていますが、なぜコードが機能しないのですか?

ご協力いただきまして誠にありがとうございます。前もって感謝します。

+0

あなたが使用している解凍ツールは、あなたのファイル名の文字を扱うことができることを確認していますか? –

+0

はいそうです。前述のように、デフォルトのubuntuアーカイブマネージャとunzipツールは、ファイルを個別にzip/unzipすることができます。しかし、私のコードで作成されたファイルには名前がつぶれています。 –

+0

私は 'ProcessBuilder'を使ってzipを作成する回避策を見つけました。しかし、それは非常に効率的な方法ではありません。誰もがJavaでそれを解決することができましたか? –

答えて

2

[更新] 最終的に、問題はコードにはないが、実際にはUbuntuのデフォルトのArchiveManagerにあるとわかりました。内容を正しく認識・抽出しない。 Windows zipハンドラで同じファイルを開いたり、抽出したりすると、完璧に動作します。

さらに、commons-compressは、zipからあまりにも離れた他のフォーマット、Javaでサポートされているgzipをサポートしています。

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

関連する問題