2012-03-01 12 views
1

私は、Javaのメカニズムを使用してzipファイルを解凍しています。タイトルにアクセントを付けたファイルがない場合、この仕組みは正常に機能します。私はポルトガル出身ですから、私の言語では、ç、ç、õ、éなどの文字が通常使用されています。この文字のいずれかがファイル名にある場合、IO例外が発生します。それはwhile((currentByte = is.read(data, 0, BUFFER)) != -1)アクセント付きのzipファイルの解凍

java.io.IOException: Stream closed 
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317) 
    at parsers.ZipParser.decompressZipFile(ZipParser.java:83) 
    at poc.MainPOC.main(MainPOC.java:61) 

にクラッシュ

while (zipFileEntries.hasMoreElements()) { 
    ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();  
    File destFile = new File(unzipDestinationDirectory, currentEntry); 
    File destinationParent = destFile.getParentFile(); 

    // create the parent directory structure if needed 
    destinationParent.mkdirs(); 

    // extract file if not a directory 
    if (!entry.isDirectory()) {     
     BufferedInputStream is = 
      new BufferedInputStream(zip_file.getInputStream(entry)); 
     int currentByte;     
     byte data[] = new byte[BUFFER]; 

     // write the current file to disk 
     FileOutputStream fos = new FileOutputStream(destFile);     
     BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER); 

     // read and write until last byte is encountered 
     while ((currentByte = is.read(data, 0, BUFFER)) != -1) { 
      dest.write(data, 0, currentByte); 
     } 

     dest.flush(); 
     dest.close(); 
     is.close(); 
    } 

は、あなたがこの問題に対処するための任意の回避策を知っていますか?圧縮解除せずにzip内のファイルのファイル名を変更することはできますか?

答えて

0

圧縮と解凍の際にエンコーディングを正しく設定する必要があると思います。 ZIPファイルを作成したときにUTF-8にしましたか?そうでない場合は、試してみることをおすすめします。

+0

私は入力zipファイルの作成責任者ではありません。私はzipファイルがどのように作成されるかに影響しません... – nunoaac

+0

あなたはその影響を見つけなければならない、またはうまくいかないでしょう。おそらく、あなたはそれらを作成しているパートナーと会話をする必要があります。 – duffymo

+0

これは本当にオプションではありません:/私はApache Commons IO libでjava.util.zipを置き換えます。 – nunoaac

3

Java 7以降では、ZipInputStreamに新しい構文があり、ファイル名に使用する文字セットを指定できます。ドキュメントhereを参照してください。

だからあなたのようなもので、あなたのZipInputStreamを作成します。

ZipInputStream zis = new ZipInputStream(new FileInputStream("your zip file"), Charset.forName("Encoding here")); 

それを使用する方法についてもう少し情報を持っているCharsetを参照してください。

ファイルを読み取る方法は変わりませんので、コンテンツを読むには別の回避策が必要です。しかし、詳細については、この回答Java zip character encodingを参照して、おそらくコードのいくつかを再利用することができます。

+1

あなたが提供した答えをチェックし、フランス語のアクセントのために働いた 'Charset.forName(" ISO-8859-1 ")'を入れました。 TY – WannaGetHigh

関連する問題