0

ビットマップをシリアライズ/デシリアライズしようとしています。Android でビットマップを保存する方法の回答- バグのあるコードは非常に役立ちます。ただし、配列を読み取ると、次のようになります。

private void readObject(ObjectInputStream in) throws IOException,
    ClassNotFoundException {
  int rowBytes = in.readInt();
  int height = in.readInt();
  int width = in.readInt();
  int bmSize = rowBytes * height;    // Ends up being 398208

  ByteBuffer byteBuffer = ByteBuffer.allocate(bmSize);
  int bytesRead = in.read(byteBuffer.array(), 0, bmSize);
  // Use array to create bitmap here
}

私が書いた398208バイトではなく、1008バイトを読み取っています。呼び出しをループに置き換えました。これは正常に機能します。

for (int i = 0; i < bmSize; i++) {
  byteBuffer.array()[i] = in.readByte();
}

何がうまくいかないのですか?例外はスローされません。ObjectInputStream.read(byte[], int, int)のドキュメントは、ストリームの最後に到達した場合に早期に返される唯一の理由を示していますが、これは私の回避策が例外をスローしないためではありません。 .

4

1 に答える 1

2

ドキュメントが間違っています。ObjectInputStream は、inputStream を呼び出してバイトを読み取るだけです。データが読み取られるまでブロックする場合は、readFully を使用します。

于 2012-05-04T04:38:20.657 に答える