使用java下载大文件

时间:2010-05-13 09:00:49

标签: java java-me

我正在构建一个应用程序,我想在手机(移动设备)上下载大文件,但是如果文件大小很大,我会收到异常套接字异常破坏的管道。

 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();  
}  

4 个答案:

答案 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连接器,它就像一个魅力。