1. ホーム
  2. java

[解決済み】例外。ZLIB入力ストリームの予期せぬ終了

2022-02-17 21:26:41

質問

がおかしいです。 GZIPInputStream または {コード . ただ、次のコードを読んでください(または実行してみてください)。

GZIPOutputStream

ファイルが作成されます def main(a: Array[String]) { val name = "test.dat" new GZIPOutputStream(new FileOutputStream(name)).write(10) println(new GZIPInputStream(new FileInputStream(name)).read()) } 1バイトを書き込む test.dat をGZIPでフォーマットし、同じファイル内のバイトを同じフォーマットで読み取る。

そして、それを実行した結果がこれです。

10

読み上げの行がなぜか逆になっているようです。

ググってみると、このエラー Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream at java.util.zip.InflaterInputStream.fill(Unknown Source) at java.util.zip.InflaterInputStream.read(Unknown Source) at java.util.zip.GZIPInputStream.read(Unknown Source) at java.util.zip.InflaterInputStream.read(Unknown Source) at nbt.Test$.main(Test.scala:13) at nbt.Test.main(Test.scala) で、2007~2010年頃に出されたOracleへのバグレポートがいくつか見つかりました。ということは、まだ何らかの形でバグが残っているのだと思いますが、自分のコードが正しいのかどうかわからないので、ここに投稿させていただき、アドバイスを聞かせてください。ありがとうございました。

解決方法

を呼び出す必要があります。 {コード を使用します。 Unexpected end of ZLIB input stream を読み取ろうとする前に、それを読み取ることができます。 ファイルの最後のバイトは、ストリームオブジェクトが実際に閉じられるときにのみ書き込まれます。

(これは、出力スタックに明示的なバッファリングがあるかどうかに関係なく、です。 ストリームは、あなたが閉じるように言ったときにだけ、最後のバイトを圧縮して書き込むことを知ります。 A close() は動作するはずです。javadocsを見てください)。

以下が正しいコードです(Javaの場合)。

GZIPOutputStream

(には関係ないので、リソース管理や例外処理・報告などはきちんと実装していません)。 目的 このコードの これを「良いコード」の例として扱わないようにしましょう)。