1

ByteArrayInputStream のドキュメントには次のように書かれています。

java.io.ByteArrayInputStream.ByteArrayInputStream(byte[] buf) buf をバッファ配列として使用するように ByteArrayInputStream を作成します。バッファ配列はコピーされません。pos の初期値は 0、count の初期値は buf の長さです。パラメータ: buf 入力バッファ。

以下のコードを実行すると、

        byte[] b = new byte[10];
    ByteArrayInputStream bais = new ByteArrayInputStream(b);
    String someText = "Java byte arrayinput stream test - this string will be used.";
    b = someText.getBytes();

    int c =0;
    while( ( c = bais.read()) != -1 ){
        System.out.print((char)c);
    }

私が得た出力は、テストに使用された文字列ではなく、10 バイトの空の配列に基づいています。これは、ByteArrayInputStream のコンストラクターが、渡されたバイト配列への参照を格納するのではなく、バイト配列をコピーする必要があることを示しています。これはドキュメントと矛盾しています。バイト配列がコピーされているかどうか、誰かが私の理解を明確にすることができますか?(コピーされていない場合、出力がバイト配列 b の状態を反映しないのはなぜですか?

4

3 に答える 3

6

問題は、割り当てステートメントにあります。入力ストリームの配列は、宣言されたものと同じです。

byte[] b = new byte[10];

ただし、String の getBytes() を使用すると、新しい配列が作成され、その値が b に割り当てられます。基本的にあなたがやったことはこれです:

byte[] tmp = someText.getBytes();  //get bytes creates a new array
b = tmp;

表示したい結果を得るには、バイト データを取得し、それを元の配列にコピーする必要があります。

byte[] tmp = someText.getBytes();
for(int i=0;i < Math.min(tmp.length, b.length);i++) {
  b[i] = tmp[i];
}

これにより、期待どおりの動作が生成されます。

于 2011-04-05T12:51:05.573 に答える
2

byte[]最初の行で最初に割り当てられたものを変更していません。

b代わりに、 new を指すように再割り当てするだけですbyte[]

代わりにこれを試してください:

b[0] = 'H';
b[1] = 'e';
b[2] = 'l';
b[3] = 'l';
b[4] = 'o';
于 2011-04-05T12:50:59.420 に答える
2

Java 変数の仕組みを誤解しています。

このステートメントは、新しいを作成byte[]し、変数に割り当てますb

byte[] b = new byte[10];

このステートメントは別の new を作成byte[]し、それを変数 に代入して、その変数bの以前の内容を置き換えます。

b = someText.getBytes();

格納されている元の値bByteArrayInputStreamコンストラクターに渡します。内部的には、ストリームには独自の変数があり、コンストラクタによって値が割り当てられます。その後、プログラムの変数を変更しますが、ストリームの変数は変更されません。

于 2011-04-05T12:51:20.723 に答える