#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';