下载大型视频文件已损坏

时间:2018-06-05 12:30:47

标签: java tomcat

在服务器端代码中,我将缓冲区大小和内容长度设置为 File.length(),然后使用 FileInputStream 设置打开文件。 稍后使用 HttpResponse.getOutputStream()获取输出流并转储使用 FileInputStream

读取的数据字节

我正在使用Apache Tomcat 7.0.52,Java 7

在客户端上 File Downloader.java

URL url = new URL("myFileURL");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setDoInput(true);
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
con.setRequestMethod("GET");
con.setUseCaches(false);
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.connect();
FileOutputStream fos = new FileOutputStream("filename");
if(con.getResponseCode()==200){
    InputStream is = con.getInputStream();
    int readVal;
    while((readVal=is.read())!=-1) fos.write(readVal);
}
fos.flush()
fos.close();

因此上面的代码无法下载大文件。 在使用Java 7的客户端

2 个答案:

答案 0 :(得分:1)

    fos.flush();
} finally {
    fos.close();
    con.close();
} 

答案 1 :(得分:1)

你能试试吗

 FileOutputStream outputStream = new FileOutputStream(fileName);
 int bytesRead;
 byte[] buffer = new byte[1024];
 while ((bytesRead = inputStream.read(buffer)) != -1) {
     outputStream.write(buffer, 0, bytesRead);
 }

引自https://stackoverflow.com/a/45453874/4121845

  

因为您只想编写实际读取的数据。考虑输入由N个缓冲区加一个字节组成的情况。如果没有len参数,您将写入(N + 1)* 1024字节而不是N * 1024 + 1字节。还要考虑从套接字读取的情况,或者实际上是读取的一般情况:InputStream.read()的实际契约是它至少传输一个字节,而不是它填充缓冲区。由于某种原因,它通常不能。