0

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

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 является DatagramPacket с помощью 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 

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

ответ

3

Это звучит как длина массива не фактически 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, как правило, camelCased, а не using_underscores_for_word_breaks)

+0

, что линия действительно доказывает, что длина массива действительно 5 .. number_bytesread + = array_bytes.length; о соглашениях об именах, о моем первом кодировании Java и моем первом использовании Stackoverflow (этот ответ будет хорошо сформирован на самом деле ...). Im, использующий соглашение об именовании c, похоже, является единственным языком, который я использовал для кодирования .. спасибо, стараюсь понять, почему byte [] array_enviar = новый байт [1024]; имеет предупреждение «значение никогда не используется» – Andre

+0

@Andre: Ну, это говорит о том, что вы не используете эту переменную - вы используете другую. Внимательно проверьте все, включая корпус! С точки зрения соглашений об именах, одно из преимуществ обучения и соблюдения конвенции нового языка, пока вы его изучаете, заключается в том, что оно усиливает сообщение о том, что оно * - это другой язык, с разными идиомами и т. Д. –