Java读取文件大于2 GB(使用分块)

时间:2011-11-24 14:26:11

标签: java networking io bytebuffer

我正在实施文件传输服务器,我遇到了通过网络发送大于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,虽然我将来会改用它。放纵我的疯狂: - )

2 个答案:

答案 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)

嗯,意识到你对变量i的处理不正确..

Iteration 0: i=0
Iteration 1: i=PACKET_SIZE
...
...
Iteration n: i=PACKET_SIZE*n