1

多数のオブジェクトをストリームに入れ、そこからバイト配列を取得して、すべてを読み戻します。最初の 2 つのデータは良好な状態で到着し、次にゼロが返され、次に EOF 例外が発生します。なんで?

try {
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
     objectOutputStream.writeObject("abcdef");
     objectOutputStream.writeInt(1);
     objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8});
     objectOutputStream.writeInt(2);
     objectOutputStream.writeObject(new byte[]{11,12,13,14,15,16,17,18});
     objectOutputStream.close();


     byte[] original = byteArrayOutputStream.toByteArray();
     System.out.println(Arrays.toString(original));

     byte[] b=new byte[8];
     ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(original));
     String s= (String) objectInputStream.readObject(); // works fine
     objectInputStream.readInt(); // works fine

     objectInputStream.read(b); // why it reads zeroes instead of [1,2,3,4,5,6,7,8]?
     System.out.println(Arrays.toString(b));
     int length = objectInputStream.readInt(); // EOF unexpectedly reached, why?
     objectInputStream.read(b);
}
catch (IOException e) {
     e.printStackTrace();
} catch (ClassNotFoundException e) {
     e.printStackTrace();
}

例外:

java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:375)
at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2775)
at java.io.ObjectInputStream.readInt(ObjectInputStream.java:949)
4

3 に答える 3

5

最初の問題はclose()objectOutputStream. 例については、 ObjectOutputStream のドキュメントを参照してください。

于 2012-09-06T14:57:40.730 に答える
3

バッファリングされたストリームを閉じるだけでなく...

各 writeInt() に対して readInt() が必要です (実行しているように) また、各 writeObject() に対して readObject() が必要です。

自分が書いたのと同じように読まなければ、意味をなすことは期待できません。

あなたがやっている

objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8});

だからあなたはする必要があります

byte[] bytes = (byte[]) objectInputStream.readObject();
于 2012-09-06T14:58:20.233 に答える
0

ObjectOutputStreamで配列を処理する方法を見てくださいwriteObject(具体的には、 を参照してください) ObjectOutputStream.writeArray()。配列マーカー バイト (格納されているオブジェクトの種類を知るため)、配列の長さ、配列要素自体を書き込みます。

readObject簡単に言えば、プレーンではなく、で読み返す必要がありますread(元のバイト配列のようにバイトが取得されることを期待せずに、実際にそのバイトストリームを自分で解析したい場合を除きます)。

InputStream.read(byte[])単純に生のバイト ストリームを取得し、それらをバッファに書き込みます。

read()さらに、デシリアライザーが理解できるデータ構造の先頭にポインターが配置されていないため、後続の呼び出し (単なる s 以外) は失敗することが予想されます。

于 2012-09-06T15:04:48.573 に答える