2011-04-05 48 views
1

上ByteArrayInputStream的文档说:ByteArrayInputStream不复制字节数组?

java.io.ByteArrayInputStream.ByteArrayInputStream(字节[] 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

看看第4行,你会发现你的论点有什么问题。什么,确切地说,b = someText.getBytes()呢? – Ingo 2011-04-05 12:52:51

+0

我意识到这一点,我只能在阅读完所有答案后才问这个问题,这是多么朴素! – Bhaskar 2011-04-05 13:00:36

回答

2

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

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

byte[] b = new byte[10]; 

此语句创建另一个新byte[],并且还分配给变量b,更换该变量的原内容:

b = someText.getBytes(); 

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

2

你没有修改最初分配的byte[]

相反的第一行你只是重新分配b指向一个新的byte[]

试试这个:

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

问题是与你的assignmen t声明。输入流中的数组是一样的一个声明:

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

这会产生你期望的行为。

相关问题