2012-05-04 16 views
0

ビットマップをシリアル化/逆シリアル化しようとしています。 android how to save a bitmap - buggy codeの回答は非常に役に立ちます。しかし、私は私の配列読み取りに行くとき:ObjectInputStream.read(byte []、int、int)データがありませんか?

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 
} 

それが1008バイトではなく、私が書いた398208のバイトを読んでいるし。間違って行くことができるもの

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

:私は正常に動作ループとの通話を、交換してきましたか?例外はスローされません。 ObjectInputStream.read(byte[], int, int)のドキュメントでは、ストリームの最後にヒットした場合に早期に返さなければならない唯一の理由が示されています。これは、私の回避策が例外をスローしないためではありません。

+0

すべてのデータを一度に読み取る必要がない場合は、ループを使用していません。 – Sameer

+0

ループはうまくいきます。組み込みメソッドが機能しなかった理由を知りたいだけでした。また、適切な方法が高速になると思われます。ネイティブコールなどを使用できる可能性があります。 – Brad

答えて

2

マニュアルが間違っています。 ObjectInputStreamは、バイトを読み取るためにinputStreamを呼び出すだけです。データが読み込まれるまでブロックするには、readFullyを使用します。

+0

+1。 Googleのドキュメントは間違っているだけでなく意味がありません。 'count'バイトが' count'を定義せずに読み込まれるまでブロックすると言います。 Java Javadocは正しいです。 – EJP

+0

多くの(多くの)ありがとう! https://android-review.googlesource.com/#/c/36320/に最新のドキュメントを掲載しました。 – Brad

関連する問題