1

ByteArrayInputStream 上的文档说:

java.io.ByteArrayInputStream.ByteArrayInputStream(byte[] buf) 创建一个 ByteArrayInputStream 以便它使用 buf 作为其缓冲区数组。不复制缓冲区数组。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指向一个新的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 回答