2017-05-02 12 views
0

DeflaterOutputStreamよりObjectOutputStreamを使用して、収縮したデータを基になるストリームに書き込もうとしています。しかし、彼らのInputStreamのカウンターパートでデータを読み込もうとすると、例外がスローされます。 Deflate{Output,Input}StreamGZip{Output,Input}Streamに置き換えると、期待どおりに動作することに注意してください。この動作を示すサンプルコードは、以下に見られることができます。DeflaterInputStream上のObjectInputStreamがStreamCorruptedExceptionをスローする

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
try(ObjectOutputStream oos = new ObjectOutputStream(new DeflaterOutputStream(baos))) { 
    oos.writeObject("test"); 
} 

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
try(ObjectInputStream oos = new ObjectInputStream(new DeflaterInputStream(bais))) { 
    System.out.println(oos.readObject()); 
} 

これは、次の例外がスローされます:exaclyこれがなぜ起こるか

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 789CAB98 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:857) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:349) 
    at Main.main(Main.java:23) 

誰でも知っていますか?

答えて

1

私はすでにそれを理解しており、それはばかげたミスです。しかし、私自身の質問に答えることで、将来の人々は再びそれに陥ることはありません:

DeflaterOutputStreamの逆クラスはDeflaterInputStreamではなく、InflaterInputStreamです。したがって、コードは次のようになります。

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
try(ObjectOutputStream oos = new ObjectOutputStream(new DeflaterOutputStream(baos))) { 
    oos.writeObject("test"); 
} 

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
try(ObjectInputStream oos = new ObjectInputStream(new InflaterInputStream(bais))) { 
    System.out.println(oos.readObject()); 
} 
関連する問題