我正在构建一个应用程序,我想在手机(移动设备)上下载大文件,但是如果文件大小很大,我会收到异常套接字异常破坏的管道。
resp.setHeader("Content-length", "" + fileLength);
resp.setContentType("application/vnd.ms-excel");
resp.setHeader("Content-Disposition","attachment; filename=\"export.mpr\"");
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(path);
byte[] buffer = new byte[1024];
int bytesRead = 0;
do
{
bytesRead = inputStream.read(buffer, offset, buffer.length);
resp.getOutputStream().write(buffer, 0, bytesRead);
}
while (bytesRead == buffer.length);
resp.getOutputStream().flush();
}
finally
{
if(inputStream != null)
inputStream.close();
}
答案 0 :(得分:3)
我不知道这是否与您的问题有关,但看起来您没有正确使用read()
。 read()
在输入结束时返回-1,即使有更多数据可用,也可能读取少于指定的字节数。我建议改为使用
while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) {
resp.getOutputStream().write(buffer, 0, bytesRead);
}
您的原始代码有可能在数据结束前终止读取循环,或者在write()
设置为-1时调用bytesRead
。此外,原始代码中的offset
变量似乎没有必要;偏移量应始终为0,因为您正在尝试填充整个缓冲区。
答案 1 :(得分:0)
如果您收到SocketException,问题不在于此处的代码,而在于底层网络协议。在这种情况下,“断管”意味着您正在丢失与服务器的连接 - 要么是因为服务器挂起,Internet连接不稳定,要么是其他东西 - 并且read
正在抛出异常因为它恰好是目前尝试使用该连接的方法。
答案 2 :(得分:0)
使用BufferedInputStream而不是FileInputStream,这为您提供了更多的功能和灵活性来读取数据。
答案 3 :(得分:0)
您的应用程序的环境是什么?我指的是哪个AppServer,WebServer等。
通过Apache Httpd和Tomcat组合提供大型文件时,我遇到了类似的问题。我的客户使用普通的webbrowser,我试图发送分块数据。 (对于非常大的文件,我正在读取一大块字节并将其发送给客户端)。
我的问题可能是因为我在httpd和tomcat之间使用的ajp连接器。我从ajp切换到两者之间的html连接器,它就像一个魅力。