Почему FileInputReader.read() читает только 5 байтов за раз (Java)?

ОК, поэтому я пытался прочитать ("любой") двоичный файл в массив байтов [], используя FileInputReader.read()... Но независимо от длины файла он читает только 5 байтов за раз... (кстати, я использую udp для отправки массива/файла)

byte[] array_bytes = new byte[1024];

while((nread=file.read(array_bytes))!=-1){

            number_bytesread += array_bytes.length;
            socket_udp.send(send_package);

            count += 1;
        }

-send_package — пакет датаграмм, использующий array_bytes для отправки сообщения

Я пытался использовать функцию чтения (байт [], смещение, длина), но если я ставлю длину больше 5, возникает эта ошибка при первом чтении, даже если файл наверняка больше 5 байтов:

nread=file.read(array_bytes, 0, 1024);

нет необходимости в смещении, так как я отправляю сразу после прочтения.

Exception in thread "main" java.lang.IndexOutOfBoundsException
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at udp_server2.UDP_Server2.Send_Udp(UDP_Server2.java:122)
at udp_server2.UDP_Server2.main(UDP_Server2.java:77)
Java Result: 1

Заранее спасибо за помощь, Андре


person Andre    schedule 23.11.2013    source источник


Ответы (1)


Похоже, что длина вашего массива не на самом деле 1024. Я знаю, что вы показали код, создающий его с 1024 байтами, но я подозреваю, что ваш фактический код либо изменяет значение где-то еще, либо он создан в по-другому.

Было бы полезно, если бы вы могли показать короткую, но завершенную программу, демонстрирующую проблему, но в противном случае первым диагностическим шагом, который я предприму, будет просмотр array_bytes.length либо в отладчике, либо в журнале. . Я сильно подозреваю, что вы обнаружите, что это 5. Как только вы это установили, вам нужно понять, почему это 5, что не имеет ничего общего с вызовами чтения из входного потока.

Также обратите внимание, что эта строка в корне неверна:

number_bytesread += array_bytes.length;

Должен быть:

number_bytesread += nread;

... потому что вы только что прочитали nread байт. Вы также отправляете send_package, который, похоже, не имеет ничего общего с данными, которые вы только что прочитали.

Кроме того, я предлагаю вам начать следовать соглашениям об именах Java, используя такие вещи, как arrayBytes, а не array_bytes. (Заметьте, я бы просто использовал buffer или data, но я указываю, что переменные и имена в Java обычно пишутся в верблюжьем регистре, а не с использованием_подчеркиваний_для_слов_разрывов.)

person Jon Skeet    schedule 23.11.2013
comment
эта строка действительно доказывает, что длина массива действительно равна 5.. number_bytesread+= array_bytes.length; о соглашениях об именах, я впервые кодирую Java и впервые использую Stackoverflow (этот ответ действительно будет хорошо отформатирован...). Я использую соглашение об именах c, кажется, это единственный язык, на котором я писал код.. спасибо, я попытаюсь понять, почему byte[] array_enviar = new byte[1024]; имеет предупреждение, что значение никогда не используется - person Andre; 23.11.2013
comment
@Andre: Ну, это говорит о том, что вы не используете эту переменную - вы используете другую. Тщательно проверьте все, включая корпус! С точки зрения соглашений об именах, одно из преимуществ изучения и следования правилам нового языка во время его изучения заключается в том, что это усиливает сообщение о том, что это это другой язык, с другими идиомами и т. д. - person Jon Skeet; 23.11.2013