7

java.util.zip。*で奇妙な動作が発生しています

私はzipファイルを持っており、解凍すると次のタイミングが発生します

ZipFile zipfile = new ZipFile(file, ZipFile.OPEN_READ);

これはexaxtエラーメッセージです

java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.zip.ZipFile.<init>(ZipFile.java:143)
at com.basware.ExtractZip.unpack(ExtractZip.java:27)
at com.basware.ExtractZip.main(ExtractZip.java:17)

しかし、次のコードを使用すると、エラーなしでアーカイブを開くことができます

try {
     BufferedOutputStream dest = null;       
     File file = new File("File_Path");        
     FileInputStream fis = new FileInputStream(file);
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
     ZipEntry entry;
     while((entry = zis.getNextEntry()) != null) {
        System.out.println("Extracting: " +entry);
        int count;
        byte data[] = new byte[BUFFER];
        // write the files to the disk
        FileOutputStream fos = new 
      FileOutputStream(entry.getName());
        dest = new 
          BufferedOutputStream(fos, BUFFER);
        while ((count = zis.read(data, 0, BUFFER)) 
          != -1) {
           dest.write(data, 0, count);
        }
        dest.flush();
        dest.close();
     }
     zis.close();

ファイルはWinZIPを使用して圧縮されることに注意してください。

私の質問は、ZipFileとZipInputStreamがほぼ同じであるため、ZipFileが例外を発生させる理由と、解凍を実行できない理由です。

編集:問題は、WinZipツールを使用してファイルを圧縮し、リストされたプログラムを使用して解凍すると正常に動作することですが、この問題は特に外部ソースからのアーカイブで発生します(外部ソースはWinZipを使用していると主張しています)。その上、WinZipツールを使用してまったく同じアーカイブ(外部アーカイブ)を開くと、ファイルが表示および解凍されますが、このJAVA固有のコード(ZipFile)はまったく機能しません。

編集:JavaネイティブコードがZIPアーカイブで機能しない理由を理解できませんが、apachecompressが問題を解決しました。IanRobertsが提案したように機能しています。

4

2 に答える 2

4

ZipFile名前で個々のエントリにアクセスできるデータ構造を構築するために、zipの最後にある「中央ディレクトリ」を解析しようとします。ZipInputStreamそうではなく、ファイルを上から下に読み取るときに、各エントリのローカルヘッダーのみを調べます。したがって、ファイルには適切なエントリがありますが、何らかの理由で中央ディレクトリが破損しているように見えます。

エントリ名の非ASCII文字のエンコードに関する問題や、zipに64kを超えるエントリがある場合など、さまざまな可能性があります。ZipFileのcommons-compress実装を試してみます-それが機能しない場合でも、java.util.zipから取得する「何かが間違っています」よりも具体的なエラーメッセージが表示されるはずです。

于 2012-12-10T09:20:03.853 に答える
0

Ian Robertの回答に加えて、Java 7がオプションである場合は、ZIPファイルシステムプロバイダーjava.util.zipを使用することを優先して、古いライブラリを回避することをお勧めします。

于 2012-12-10T13:21:53.650 に答える