【问题标题】:ByteArrayInputStream does not copy the byte array?ByteArrayInputStream 不复制字节数组?
【发布时间】:2011-04-05 12:45:31
【问题描述】:

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 行,您会发现您的论点有什么问题。 b = someText.getBytes() 到底是做什么的?
  • 我意识到了..,我只能对我在阅读所有答案后提出问题的方式感到震惊!

标签: java bytearrayinputstream


【解决方案1】:

问题出在你的赋值语句上。输入流中的数组和声明的一样:

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

这将产生您期望的行为。

【讨论】:

    【解决方案2】:

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

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

    byte[] b = new byte[10];
    

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

    b = someText.getBytes();
    

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

    【讨论】:

      【解决方案3】:

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

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

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-17
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 2018-10-05
        相关资源
        最近更新 更多