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的状态?
答案 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
构造函数。在内部,流有自己的变量,由构造函数赋值。然后,您更改程序的变量,但这样做不会更改流的变量。