使用java下载大型文件

使用java下载大型文件,java,java-me,Java,Java Me,我正在构建一个应用程序,我想在手机上下载大文件,但若文件太大,我会收到异常套接字异常断管 resp.setHeader("Content-length", "" + fileLength); resp.setContentType("application/vnd.ms-excel"); resp.setHeader("Content-Disposition","attachment; filename=\"export.mpr\""); FileInput

我正在构建一个应用程序,我想在手机上下载大文件,但若文件太大,我会收到异常套接字异常断管

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

如果您遇到SocketException,问题不在于这里的代码,而在于底层的网络协议。在这种情况下,“断管”意味着你正在失去与服务器的连接——要么因为服务器挂断,要么因为互联网连接不稳定,或者其他什么-
read
正在抛出异常,因为它恰好是当前尝试使用该连接的方法。

我不知道这是否与您的问题有关,但看起来您没有正确使用
read()
read()
在输入结束时返回-1,即使有更多数据可用,读取的字节数也可能小于指定的字节数。我建议改为使用

while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) {
    resp.getOutputStream().write(buffer, 0, bytesRead);
}

您的原始代码可能会在数据结束之前终止读取循环,或者在
bytesRead
设置为-1的情况下调用
write()
。此外,原始代码中的
offset
变量似乎没有必要;偏移量应始终为0,因为您正在尝试填充整个缓冲区。

使用BufferedInputStream而不是FileInputStream,这为您读取数据提供了更大的能力和灵活性。

您的应用程序环境是什么?我指的是哪个应用服务器、Web服务器等

在通过ApacheHTTPD和Tomcat组合提供大文件时,我遇到了类似的问题。我的客户使用的是普通的网络浏览器,而我则试图发送分块数据。(对于非常大的文件,我正在读取一大块字节并将其发送到客户端)


我的问题可能是因为我在httpd和tomcat之间使用的ajp连接器。我在两者之间从ajp切换到html connector,效果非常好。

我同意Etaoin,但我可以下载小文件,比如说以kbs为单位的abt,但问题是当文件大小较大时。文件越大,所需时间越长,这意味着更可能出现零星问题。例如,如果您的连接平均每10秒重置一次,一分钟的下载比一秒钟的下载更容易看到。谢谢,现在我该如何解决我的问题。我正在使用grrs连接,使用上述代码在手机上下载文件。我该如何解决此问题。