0

OK,所以我一直试图用FileInputReader.read()读取一个(“任意”)二进制文件到一个byte []数组......但是无论文件长度如何,它一次只能读取5个字节。 .. (顺便说一句即时使用UDP来发送阵列/文件)为什么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是使用array_bytes发送消息

我试图使用读功能的DatagramPacket的(字节[] ,offset,lenght),但是如果我把长度超过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。 (我只是使用bufferdata,请注意 - 但我指出Java中的变量和名称通常是camelCased而不是using_underscores_for_word_breaks。)

+0

该行确实证明数组的长度确实是5 .. number_bytesread + = array_bytes.length;关于命名约定,它是我第一次编写Java,而且我第一次使用Stackoverflow(这个回答的确很好,......)。我使用c命名约定似乎这是我用来编码的唯一语言..谢谢生病尝试了解为什么byte [] array_enviar = new byte [1024];有警告“价值永远不会被使用” – Andre

+0

@Andre:这表明你没有使用这个变量 - 你正在使用一个不同的变量。仔细检查一切,包括套管!在命名惯例方面,学习和遵循新语言习惯的一个好处是,它强化了它是一种不同的语言和不同的习语等的信息。 –

相关问题