我正在实施文件传输服务器,我遇到了通过网络发送大于2 GB的文件的问题。当我得到我想要使用的File
并尝试将其内容读入byte[]
时,问题就开始了。我有一个for循环:
for(long i = 0; i < fileToSend.length(); i += PACKET_SIZE){
fileBytes = getBytesFromFile(fileToSend, i);
其中getBytesFromFile()
从PACKET_SIZE
读取fileToSend
个字节,然后在for循环中发送到客户端。 getBytesFromFile()
使用i
作为偏移量;但是,FileInputStream.read()
中的偏移量变量必须是int
。我确定有更好的方法将这个文件读入数组,我还没有找到它。
我宁愿不使用NIO,虽然我将来会改用它。放纵我的疯狂: - )
答案 0 :(得分:4)
看起来你没有正确地从文件中读取数据。在Java中从流中读取数据时,将数据读入缓冲区是标准做法。缓冲区的大小可以是您的数据包大小。
File fileToSend = //...
InputStream in = new FileInputStream(fileToSend);
OutputStream out = //...
byte buffer[] = new byte[PACKET_SIZE];
int read;
while ((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
in.close();
out.close();
请注意,缓冲区数组的大小保持不变。 但是 - 如果无法填充缓冲区(比如当它到达文件的末尾)时,数组的其余元素将包含来自最后一个数据包的数据,因此您必须忽略这些元素(这是我的代码示例中的out.write()
行吗?
答案 1 :(得分:-1)
Iteration 0: i=0
Iteration 1: i=PACKET_SIZE
...
...
Iteration n: i=PACKET_SIZE*n