2011-01-15 56 views
0

ファイルからバイト[]を読み込んで読み込むために単純なもの(外部ライブラリはありません)を探しています。多かれ少なかれ[Python's pickle] [1]のようなものです。ファイルからバイト[]を読み込み、読み込みます

byte[] bytes = new byte[10]; 
ByteBuffer bbuf = new ByteBuffer.allocate(bytes.length); 
bbuf.wrap(bytes); // edited due to Jon Skeet's answer 
CharBuffer cbuf = bbuf.asCharBuffer(); 
cbuf.put("t"); 
FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

問題は、そのようなファイルからオブジェクト構造体を読み取ることができないように思えます。さらに、ヘキサエディタでは、ファイル "somebytes"には数個または0個だけ含まれています。したがって、FileOutputStreamは、コンテンツ(「t」またはバイト相当物)のいずれかをそれに挿入するようには見えません。

[1] http://wiki.python.org/moin/UsingPickle

答えて

4

をあなたはbytesサイズでバイトのバッファを割り当てられましたが、それはバイトのバッファがバイト配列に関連付けられているわけではありません。 ByteBuffer.wrapを使用してバイト配列をラップすることができます。実際のコードのためにあなたは必ず、ファイルが常に閉じされていることを確認するためにブロック遂に/試みを使用する必要があること

byte[] bytes = new byte[10]; 
ByteBuffer bbuf = ByteBuffer.wrap(bytes); 
CharBuffer cbuf = bbuf.asCharBuffer(); 
cbuf.put("t"); 
FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

注:ここでは

がファイルにtを書きませんあなたのコードに最小限の変更です例外にかかわらず

ただし、これはシリアル化からの長い道のりです。 Java は独自のバイナリシリアル化を持っています - ObjectOutputStreamObjectInputStreamを参照してください。個人的には、この種のシリアライゼーションを避けるのが一般的ですが、クラスの変更に直面すると非常に脆くなる可能性があります。シリアル化には、バイナリシリアル化にはThriftやProtocol Bufferを使用したり、XML、JSONなどの人間が読める形式にシリアル化するなど、さまざまな方法があります。

+0

ファイルには 't'の1バイト、その後に 'null'の\ 0バイトが続きます。それが意図されているかどうかはわかりません。 –

+0

@Peter:私は元のコードをいくつかのデータ*をディスクに書き込もうとしていました。最終的な目的がより完全なシリアライゼーションであることを考えれば、私は答えの最後の部分でそれについて議論しました。 –

0

あなたは

seek(position) 
b = read(length) 

はその後、Bは、あなたの長さのバイト配列になりますことができます。

申し訳ありませんが、あなたは読書ではなく、読書を探しています。

-1

同じもののより単純なバージョンです。

byte[] bytes = new byte[10]; 
bytes[1] = 't'; 

FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

ウェブ上のファイルからバイト[]を読み書きする方法の例がたくさんあります。 googleを試してみてください。

+2

これはコンパイル時には、バイトの範囲内にあるchar定数を使用しているため、ちょっとしたことです - バイト配列に*文字*を直接格納しようとします(特定の種類のエンコーディング、バイト配列をラップするcharバッファなど)は本当に悪い考えです。 –

関連する問題