`

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

 
阅读更多

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

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

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

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

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

setFixedLengthStreamingMode

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

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

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

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

 

  1. private void uploadFile()  
  2.     {  
  3.         String urlResouce = 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. //      File localFile = new File("C:\\Users\\maomao\\Documents\\111.png");  
  8.         File localFile = new File("Z:\\tools\\myeclipse-8.5.0-win32.exe");  
  9.     //创建客户端签名  
  10.     String clientToken = new CreateSignTokenImpl().getToken("caizhonghu",secretKey);  
  11.     HttpURLConnection urlConnection =  
  12.     (HttpURLConnection) (new URL(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.     OutputStream urlOutputStream = urlConnection.getOutputStream();  
  20.     FileInputStream fileInputStream = new FileInputStream(localFile);  
  21.     IOUtils.copy(fileInputStream, urlOutputStream);  
  22.       
  23. //   byte[] buffer = new byte[10240];  
  24. //     long count = 0;  
  25. //     int n = 0;  
  26. //     while (-1 != (n = fileInputStream.read(buffer))) {  
  27. //       urlOutputStream.write(buffer, 0, n);  
  28. //         count += n;  
  29. //         urlOutputStream.flush();  
  30. //     }  
  31.     fileInputStream.close();  
  32.     urlOutputStream.close();  
  33.     System.out.println(urlConnection.getResponseCode());  
  34.     }  
  35.     catch(Exception e)  
  36.     {  
  37.         e.printStackTrace();  
  38.     }  
  39.     } 
分享到:
评论

相关推荐

    使用HttpUrlConnection实现上传文件 服务器端代码

    - 考虑使用异步处理大文件,以免阻塞服务器线程。 - 为了提高性能,可以使用缓冲技术读写文件。 7. **my_upload文件夹**: 这个文件夹可能包含了实现上述功能的Java源代码、测试用例或其他辅助文件。实际项目中...

    本示例使用HttpUrlConnection实现上传文件

    在Android开发中,有时我们需要将本地的文件...通过理解以上步骤和注意事项,开发者可以有效地利用HttpURLConnection在Android应用中实现代理文件上传功能。同时,了解服务器端如何接收和处理这些文件也是至关重要的。

    JAVA通过HttpURLConnection 上传和下载文件的方法

    JAVA通过HttpURLConnection上传和下载文件的方法 JAVA通过HttpURLConnection上传和下载文件的方法是非常有实用价值的,需要的朋友可以参考下。HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入...

    HttpURLConnection servlet 多文件参数 断点上传

    断点上传是一种提高大文件上传效率和可靠性的技术,允许用户在上传过程中暂停并恢复上传。在Java中实现断点上传,我们需要维护一个客户端的进度记录,包括已上传文件的部分位置和文件总大小。每次上传时,检查本地...

    Java自带的HttpURLConnection访问接口实现文件上传

    在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...

    HttpURLConnection文件下载\httpURLConnection文件下载

    在给定的代码片段中,展示了如何使用`HttpURLConnection`进行文件下载。 首先,我们看到代码引入了`java.io`、`java.net`和`java.util`这三个包。`java.io`包含了输入/输出流,用于处理数据的读写;`java.net`包含...

    HttpURLConnection读取本地目录上传远程服务器

    本话题主要关注如何使用`HttpURLConnection`来实现从本地目录读取资源并上传到远程服务器的功能。 首先,`HttpURLConnection`是`java.net.URL`类的子类,它可以建立与指定URL所代表的服务器的连接,并执行HTTP协议...

    android HttpURLConnection上传图片demo

    这个"android HttpURLConnection上传图片demo"提供了一个具体的示例,教我们如何使用HttpURLConnection来完成这一任务。HttpURLConnection是Java标准库中的一个类,它允许Android应用程序与HTTP服务器进行通信,执行...

    Android-使用HttpURLConnection实现断点续传

    在Android开发中,网络编程是不可或缺的一部分,尤其是在处理大文件下载时,断点续传功能显得尤为重要。HttpURLConnection是Java标准库提供的一种网络连接接口,适用于Android系统,它提供了更高效、更灵活的网络...

    HttpUrlConnection下载文件

    ### HttpUrlConnection下载文件:Java实现详解 在Java编程中,`HttpUrlConnection`是用于发送HTTP请求和接收响应的标准工具之一。它提供了一个简单而强大的API来与Web服务器进行交互,包括GET、POST等HTTP方法。...

    HttpURLConnection实现三方接口调用,带有FILE文件参数

    HttpURLConnection实现三方接口HTTP调用调用,带有FILE文件参数

    Android基于HttpUrlConnection类的文件下载实例代码

    HttpUrlConnection类是Android系统中的一种基本的网络请求方式,通过该类可以实现文件下载、上传等功能。 在本文中,我们将通过实例代码,介绍Android基于HttpUrlConnection类的文件下载功能。该实例代码可以帮助...

    Java 中HttpURLConnection附件上传的实例详解

    * 高效:HttpURLConnection可以实现高效的数据传输,适合大文件上传。 * 广泛支持:HttpURLConnection是Java语言中的标准类,广泛支持各种操作系统和服务器。 然而,使用HttpURLConnection实现附件上传也存在一些...

    Android程序开发通过HttpURLConnection上传文件到服务器

    值得注意的是,上传大文件时,需要考虑内存管理,因为文件可能会被完全加载到内存中。为了防止内存溢出,可以考虑使用流式处理,或者使用第三方库如`Apache Commons FileUpload`来处理上传。 总的来说,使用`...

    java实现大文件上传并有进度条及其代码解析

    大文件上传的关键在于避免一次性加载整个文件到内存,因为这可能导致内存溢出。Java中,我们可以使用`InputStream`和`OutputStream`来读取和写入文件,通过设置缓冲区大小,分块处理文件。例如,每次读取1MB的数据...

    Netroid框架和HttpURLConnection类的文件下载demo

    本文将深入探讨“Netroid框架”和“HttpURLConnection类”的使用,并通过一个文件下载的示例来阐述如何利用它们进行文件传输,同时关注性能指标如下载速度。 **Netroid框架** Netroid是一个轻量级的Android网络...

    支持超大文件上传带进度条示例

    1. **分块上传**:由于Java标准库的`Servlet`或`HttpURLConnection`不支持大文件流式上传,因此通常采用分块上传的方式。将大文件分割成小块,逐个上传,这样可以避免一次性加载整个文件到内存中,减少内存压力。 2...

    Android移动开发-使用HttpURLConnection实现多线程的下载

    实例Demo程序来示范使用HttpURLConnection实现多线程下载。 使用多线程下载文件可以更快完成文件的下载,因为客户端启动多条线程进行下载就意味着服务器也需要为该客户端提供响应的服务。假设服务器同时最多服务100...

    dotnet 6 使用 HttpWebRequest 进行 POST 文件将占用大量内存.rar

    然而,在处理大文件上传时,如果直接读取整个文件到内存,会导致内存消耗过高,尤其是对于大文件,这可能会引发性能问题甚至内存溢出错误。`HttpWebRequest`并不直接支持流式上传,因此需要开发者采取一些技巧来实现...

Global site tag (gtag.js) - Google Analytics