【发布时间】:2012-01-05 17:07:07
【问题描述】:
我正在实现一个文件传输服务器,但在通过网络发送大于 2 GB 的文件时遇到了问题。当我得到我想使用的File 并尝试将其内容读入byte[] 时,问题就开始了。我有一个 for 循环:
for(long i = 0; i < fileToSend.length(); i += PACKET_SIZE){
fileBytes = getBytesFromFile(fileToSend, i);
其中getBytesFromFile() 从fileToSend 读取PACKET_SIZE 字节数,然后在for 循环中将其发送到客户端。 getBytesFromFile() 使用 i 作为偏移量;但是,FileInputStream.read() 中的偏移变量必须是 int。我确信有更好的方法可以将这个文件读入数组,我只是还没有找到它。
我宁愿不使用 NIO,尽管我将来会改用 NIO。放纵我的疯狂:-)
【问题讨论】:
-
你的文件传输服务器是用什么写的?你使用 servlet 吗?如果是这样,只需使用
HttpServletResponse.getOutputStream()方法并将文件内容直接流式传输到输出流...您不必自己进行任何分块工作。 -
我用的是
Sockets和ServerSockets,据我所知只能发byte[]。我错过了什么吗? -
不,您没有使用 servlet :) 我想我现在看到了您的问题。因为文件太大,
int变得太小。让我写一个答案 -
您最有可能发现最有效的缓冲区大小约为 32 KB(L1 缓存的大小)
标签: java networking io bytebuffer