ByteArrayInputStream не копирует байтовый массив? - PullRequest
1 голос
/ 05 апреля 2011

Документация по 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 должен копировать байтовый массив, а не хранить ссылку на переданный байтовый массив. Это противоречит документации. Может ли кто-нибудь прояснить мое понимание, если байтовый массив копируется или нет?

Ответы [ 3 ]

6 голосов
/ 05 апреля 2011

Проблема с вашим оператором присваивания.Массив во входном потоке совпадает с объявленным:

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 голосов
/ 05 апреля 2011

Вы неправильно понимаете, как работают переменные Java.

Этот оператор создает новый byte[] и присваивает его переменной b:

byte[] b = new byte[10];

Этот оператор создает еще один новый byte[], а также присваивает его переменной b, заменяя прежнее содержимое этой переменной:

b = someText.getBytes();

Вы передаете исходное значение, сохраненное в b, конструктору ByteArrayInputStream.Внутренне поток имеет свою собственную переменную, которой конструктор присваивает значение.После этого вы изменяете переменную программы, но это не меняет переменную потока.

2 голосов
/ 05 апреля 2011

Вы не изменяете byte[], изначально выделенный в первой строке.

Вместо этого вы просто переназначаете b, чтобы указать на новый byte[].

Попробуйте вместо этого:

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