2016-08-14 3 views
-1

В коде я генерирую массив байтов из 2 целых чисел с использованием байтового буфера. Когда я пытаюсь записать массив в выходной поток, я получаю исключение ArrayIndexOutOfBounds. Параметр длины метода write (array, offset, length) в OutputSteam полагает, что массив будет меньше длины массивов, даже когда я передам свойство из самого массива. Я проверил, что файл достаточно велик, написав фиктивные данные, но я все равно получаю то же исключение.Длина массива байтов неверна

OutputStream out = new FileOutputStream("File"); 
ByteBuffer buff = ByteBuffer.alocate(Integer.BYTES*2); 
buff.putInt(18); 
buff.putInt(32); 
byte[] array = buff.array(); 

out.write(array, 0, array.length); // Heres where the problem comes in 
+0

Какое у вас должное? –

+3

Этот код недействителен Java. Если вам нужна помощь, вам нужно отправить код _actual_ Java, который не сработает, а не перефразировать его. Также опубликуйте трассировку стека и укажите значения переменных, таких как 'offset'. –

+0

Нет, проблема возникает раньше, чем строка с комментарием. На данный момент это факт, что вы отправляете код, который даже не компилируется. – GhostCat

ответ

1

Ну, arrray имеет N объектов, а последний объект индексируется N-1, так как он начинается с 0. array.length является N, и вы хотите, N-1.

+0

Этот вызов 'write' совершенно правдоподобен:' element b [off] - это первый байт, а b [off + len-1] - последний байт, записанный этой операцией. –

+0

Я пытался это сделать, без радости, даже после вычитания более половины – Honin

+0

В этом случае я понятия не имею. Я думаю, что это может быть проблемой с 'out'. Самый лучший способ решить проблемы, по моему опыту, - либо прислушиваться к ошибкам, либо публиковать более подробную информацию в Интернете. – Darkrifts

0

Поскольку array.length дает вам количество байтов, вы должны использовать Integer.BYTES (байты на целое число), а не Integer.SIZE (бит на целое число) при распределении для буфера.

ByteBuffer buff = ByteBuffer.allocate(Integer.BYTES*2); 
buff.putInt(18); 
buff.putInt(32); 
byte[] array = buff.array(); 
+0

Это по-прежнему приводит к исключению IndexOutOfBounds при записи в выходной поток – Honin

Смежные вопросы