为什么FileInputReader.read()一次只读取5个字节(Java)?

时间:2013-11-23 13:08:47

标签: java byte java-io indexoutofboundsexception fileinputstream

好的,所以我一直在尝试使用FileInputReader.read()读取一个(“任何”)二进制文件到byte []数组......但无论文件长度如何,它一次只读取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发送消息的数据报文

我试过使用函数read(byte [],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

提前感谢您的帮助, 安德烈

1 个答案:

答案 0 :(得分:3)

听起来你的数组长度实际上 1024.我知道你已经显示了用1024字节创建代码的代码,但我怀疑你的实际代码是在其他地方更改了值,或者是它是以不同的方式创建的。

如果你能展示一个简短但完整的程序来证明这个问题会很有帮助,但如果不这样做,我要采取的第一个诊断步骤是查看array_bytes.length,在调试器中或通过日志记录。我强烈怀疑你会发现它是5.一旦你确定了它,你需要找出为什么它是5,这与从输入流中读取的调用无关。 / p>

另请注意,这一行基本上是错误的:

number_bytesread += array_bytes.length;

应该是:

number_bytesread += nread;

...因为您刚读过nread个字节。您还发送了send_package,它似乎与您刚刚阅读的数据无关。

此外,我建议您开始遵循Java命名约定,使用arrayBytes而不是array_bytes。 (我只想使用bufferdata,但我要指出Java中的变量和名称通常是camelCased而不是using_underscores_for_word_breaks。)