3

メインフレームの PKZIP ツールで圧縮されたファイルを解凍するプログラムを Java で作成しようとしています。ただし、以下の 3 つの方法を試しましたが、いずれも問題を解決できません。

  1. エグゼで。

    WinRAR、7Zip、Linuxコマンド(unzip)で開いてみました。すべてが以下のエラー メッセージで失敗します。

    アーカイブが不明な形式であるか、破損しています

  2. JDK API による - java.util.ZipFile

    このWebサイトで説明されているように、JDK APIで解凍しようとしました。ただし、次のエラー メッセージで失敗します。

    IO エラー: java.util.zip.ZipException: zip ファイルを開く際のエラー

  3. Zip4Jによって

    また、Zip4J を使用しようとしました。エラーメッセージで失敗しました:

    原因: java.io.IOException: Negative seek offset at java.io.RandomAccessFile.seek(Native Method) at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117) ... 5 詳細

メインフレームで PKZIP によって圧縮された zip ファイルを抽出できる Java lib または Linux コマンドがあるかどうか尋ねてもよろしいですか? どうもありがとう!

4

1 に答える 1

4

z/OS で PKZip で圧縮され、Linux に転送されたファイルを正常に読み取ることができました。私は java.util.zip* クラスでそれらを読むことができました:

        ZipFile ifile = new ZipFile(inFileName);
        // faster to loop through entries than open the zip file as a stream
        Enumeration<? extends ZipEntry> entries = ifile.entries();  

        while ( entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();
            if (!entry.isDirectory()) {  // skip directories
                String entryName = entry.getName();
                // code to determine to process omitted
                InputStream zis = ifile.getInputStream(entry); 
                // process the stream
            }
        }

jarファイル形式は単なるzipファイルなので、「jar」コマンドはそのようなファイルも読み取ることができます。

他の人たちと同じように、ファイルがバイナリで転送されていないために破損したのではないかと思います。Linux では、xxd ユーティリティ (head 経由でパイプ処理) を使用して最初の数バイトをダンプし、zip ファイルのように見えるかどうかを確認できます。

# xxd myfile.zip | head
0000000: 504b 0304 2d00 0000 0800 2c66 a348 eb5e  PK..-.....,f.H.^

最初の 4 バイトは次のようになります。zip ファイルについては、ウィキペディアのエントリも参照してください。

最初の 4 バイトが正しい場合でも、転送中にファイルが切り捨てられた場合、破損したファイル メッセージが表示される可能性があります。

于 2016-11-13T13:48:55.950 に答える