ByteArrayInputStream不复制字节数组?

时间:2011-04-05 12:45:31

标签: java bytearrayinputstream

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的状态?

3 个答案:

答案 0 :(得分: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];
}

这将产生您期望的行为。

答案 1 :(得分:2)

您没有修改第一行中最初分配的byte[]

相反,您只需重新指定b以指向新的byte[]

请改为尝试:

b[0] = 'H';
b[1] = 'e';
b[2] = 'l';
b[3] = 'l';
b[4] = 'o';

答案 2 :(得分:2)

您误解了Java变量的工作原理。

此语句创建一个新的byte[]并将其分配给变量b

byte[] b = new byte[10];

此语句创建另一个新byte[],并将其分配给变量b,替换该变量的前一内容:

b = someText.getBytes();

您将b中存储的原始值传递给ByteArrayInputStream构造函数。在内部,流有自己的变量,由构造函数赋值。然后,您更改程序的变量,但这样做不会更改流的变量。