ByteArrayInputStream не копирует массив байтов?

#java #bytearrayinputstream

#java #bytearrayinputstream

Вопрос:

В документации по ByteArrayInputStream говорится :

java.io.ByteArrayInputStream.ByteArrayInputStream(byte[] buf) Создает ByteArrayInputStream, чтобы он использовал buf в качестве своего буферного массива. Массив буферов не копируется. Начальное значение pos равно 0, а начальное значение count равно длине буфера обмена. Параметры: буферизует входной буфер.

Когда я запускаю приведенный ниже код ,

         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?

Комментарии:

1. Посмотрите на строку 4, и вы увидите, что не так с вашим аргументом. Что именно делает b = someText.getBytes()?

2. Я понимаю это .., я могу быть только шокирован тем, насколько наивным я задавал вопрос после прочтения всех ответов!

Ответ №1:

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

 byte[] b = new byte[10];
  

Однако, когда вы используете строку 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';