0

ファイルからバイト[]を書き込んでロードするための単純なもの(外部ライブラリがないことが望ましい)を探しています。多かれ少なかれ [Python のピクルス][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();

問題は、そのようなファイルからオブジェクト構造を読み取れないことです。さらに、16 進エディタでは、ファイル「somebytes」には 2 つまたは 0 しか含まれていません。そのため、FileOutputStream がコンテンツ (「t」またはバイトに相当するもの) をそれに入れているようには見えません。

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

4

3 に答える 3

4

のサイズのバイト バッファーを割り当てましたbytesが、それはバイト バッファーがバイト配列に関連付けられているという意味ではありません。を使用してバイト配列をラップできますByteBuffer.wrap

をファイルに書き込むコードの最小限の変更を次に示します。t

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();

実際のコードでは、try/finally ブロックを使用して、例外に関係なくファイルが常に閉じられるようにする必要があることに注意してください。

ただし、これはシリーズ化にはほど遠いものです。Javaには独自のバイナリ シリアライゼーションがあります。 および を参照ObjectOutputStreamしてくださいObjectInputStream。個人的には、クラスの変更に直面すると非常に脆弱になる可能性があるため、通常、この種のシリアライゼーションは避けます。バイナリ シリアライゼーションに Thrift または Protocol Buffers を使用したり、XML、JSON、またはその他の人間が読み取れる形式にシリアライズしたりするなど、シリアライゼーションには他にもさまざまなアプローチがあります。

于 2011-01-15T10:07:51.870 に答える
0

あなたはできる

seek(position)
b = read(length)

次に、 b は長さのバイト配列になります。

申し訳ありませんが、読み直すのではなく、書くことを探しています。

于 2011-01-15T10:08:41.233 に答える
-1

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

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

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

Web 上のファイルから byte[] を読み書きする方法の例はたくさんあります。グーグルを試してください。

于 2011-01-15T16:27:22.880 に答える