gpt4 book ai didi

java - ByteArrayInputStream 不复制字节数组?

转载 作者:行者123 更新时间:2023-11-29 09:57:28 26 4
gpt4 key购买 nike

关于 ByteArrayInputStream 的文档说:

java.io.ByteArrayInputStream.ByteArrayInputStream(byte[] buf) Creates a ByteArrayInputStream so that it uses buf as its buffer array. The buffer array is not copied. The initial value of pos is 0 and the initial value of count is the length of buf. Parameters: buf the input buffer.

当我运行下面的代码时,

        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 的构造函数必须复制字节数组而不是存储对传递的字节数组的引用。这与文档相矛盾。任何人都可以澄清我的理解,如果字节数组被复制或不复制?(如果它没有被复制,那么为什么输出不反射(reflect)字节数组 b 的状态?

最佳答案

问题出在你的赋值语句上。输入流中的数组与声明的相同:

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];
}

这将产生您期望的行为。

关于java - ByteArrayInputStream 不复制字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5552035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com