HttpURLConnection 上传大文件 内存溢出 out of memery

项目中遇到问题总结一下:

在使用HttpURLConnection 上传大文件时,出现内存溢出的错误,这让我产生了错觉,输入和输出流咋会暂用内存,不就是一个数据传送的管道么,都没有把数据读取到内存中,为撒会报错。。。然后就纠结了。。。

不过实在与原来的经验相违背,然后写了一个示例直接从file中读出然后写入到输出流中,发现并没有问题

这下确认了问题出在HttpURLConnection,查看API发现,HTTP会有缓冲机制,缓存把JVM撑挂了导致内存溢出了。。。。

通过设置以下方法即可解决问题

setFixedLengthStreamingMode

public void setFixedLengthStreamingMode(intcontentLength)
此方法用于在预先已知内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。

如果应用程序尝试写入的数据多于指示的内容长度,或者应用程序在写入指示的内容长度前关闭了 OutputStream,将抛出异常。

启用输出流时,不能自动处理验证和重定向。如果需要验证和重定向,则在读取响应时将抛出 HttpRetryException。可以查询此异常以获取错误的详细信息。

该方法必须在连接 URLConnection 前调用。


  1. privatevoiduploadFile()
  2. {
  3. StringurlResouce=null;
  4. //urlResouce="http://localhost:8080/application_interface_manager/platform/wangpan/444.png";
  5. urlResouce="http://localhost:8080/application_interface_manager/platform/wangpan/myeclipse111.exe";
  6. try{
  7. //FilelocalFile=newFile("C:\\Users\\maomao\\Documents\\111.png");
  8. FilelocalFile=newFile("Z:\\tools\\myeclipse-8.5.0-win32.exe");
  9. //创建客户端签名
  10. StringclientToken=newCreateSignTokenImpl().getToken("caizhonghu",secretKey);
  11. HttpURLConnectionurlConnection=
  12. (HttpURLConnection)(newURL(urlResouce)).openConnection();
  13. urlConnection.setChunkedStreamingMode(0);
  14. urlConnection.setRequestProperty("Charset","UTF-8");
  15. urlConnection.setRequestProperty("Token","jingdong"+accessKey+":"+clientToken);
  16. urlConnection.setDoInput(true);
  17. urlConnection.setDoOutput(true);
  18. urlConnection.setRequestMethod("PUT");
  19. OutputStreamurlOutputStream=urlConnection.getOutputStream();
  20. FileInputStreamfileInputStream=newFileInputStream(localFile);
  21. IOUtils.copy(fileInputStream,urlOutputStream);
  22. //byte[]buffer=newbyte[10240];
  23. //longcount=0;
  24. //intn=0;
  25. //while(-1!=(n=fileInputStream.read(buffer))){
  26. //urlOutputStream.write(buffer,0,n);
  27. //count+=n;
  28. //urlOutputStream.flush();
  29. //}
  30. fileInputStream.close();
  31. urlOutputStream.close();
  32. System.out.println(urlConnection.getResponseCode());
  33. }
  34. catch(Exceptione)
  35. {
  36. e.printStackTrace();
  37. }
  38. }

你可能感兴趣的:(HttpURLConnection 上传大文件 内存溢出 out of memery)