位置: 编程技术 - 正文

HttpURLConnection的流式输出的缺陷和解决方法

编辑:rootadmin

推荐整理分享HttpURLConnection的流式输出的缺陷和解决方法,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

最近在用applet写文件上传控件的时候发现使用URLConnection来对服务器进行流式输出时的一些问题.我们通常要对服务器上的某个地址进行写流操作,那么我们一般的做法就是:

这样我们就获取一个到/test.do地址的HTTP连接了,我们打印con的class后发现其实是:sun.net.www.protocol.http.HttpURLConnection这个类,我们在写大数据流到服务器上时就会发现总是会出现OutOfMemoryError的错误,当然不同的机器上出现错误所对应的文件输出流的大小是不一样的.这个主要就是取决于本机的JVM的内存空间的大小了.出现OutOfMemoryError错误的主要原因就是:sun公司实现的HttpURLConnection的输出流是首先在本地内存进行缓存,然后再一次性输出的(在close操作时).我们可以追踪到sun自己的HttpURLConnection使用的OutputStream是sun.net.www.http.PosterOutputStream这个类,我们查看这个类的源码就会发现它是继承自ByteArrayOutputStream的,而且基本上这个类没有做任何事情,大家可以参看其源码.而我们的ByteArrayOutputStream则是每次将要输出的内容复制到一个byte数组中,从而导致的结果是将整个输出流全部存储在内存中,这样当我们输出流一大的时候就会出现内存不够用的情况.请看ByteArrayOutputStream的部分源码:

我们可以看到它是使用System.arraycopy的功能来将所有的输出流存放在一个数组中的.因此,在使用HttpURLConnection进行流式输出的时候如果输出流比较大,那么就该考虑使用其他方式了(当然,修改JVM的堆栈空间是一种方法,但是不可取).

这是我们直接使用java.net.HttpURLConnection类的相关方法来进行输出文件流,我们查看sun提供的HttpURLConnection的源码,会发现其默认是采用上面提高的PosterOutputStream类来进行缓冲输出的,即首先将所有的文件流在本地内存中进行缓存,等到输出结束执行close的时候一次性输出到服务器端.同时我们看到sun的HttpURLConnection中的getOutputStream()中有如下代码:

HttpURLConnection的流式输出的缺陷和解决方法

其中strmeanming()方法是用来判断是否是流式的输出,其代码为:return fixedContentLength != -1 || chunkLength != -1;它的判断方法就是如果设置了输出流的固定长度或是设置了块的长度,那么将采用流式输出.因此,我们可以在输出的时候可以设置其长度来达到流式输出这样的效果.另外,StreamingOutputString类是sun提供的HttpURLConnection的内部类,继承自FilterOutputStream,而非ByteArrayOutputStream,所以不会在本地内存中进行缓存.

而jdk中的HttpURLConnection并没有提供设置流的固定长度或块输出的长度方法,所以我们需要显示的将new URL(“url”).openConnection()返回的URLConnection转换成sun的HttpURLConnection,从而我们就可以很方便的使用setFixedLengthStreamingMode方法来设置流的固定长度,那么也就会采用流式的输出了.那么也就不会出现OutOfMemoryError的错误了.另外,ChunkedOutputStream也是不会在本地进行缓存的,它是使用固定大小的数组来缓存输出流,等缓存满的时候就自动的调用基础流进行输出,这个主要是用在无法确定输出流的具体长度但是又不想在本地进行缓存时用到.同理,我们通过设置setChunkedStreamingMode就可以达到这样的效果,三种方式的代码如下:

第1种方式:使用直接输出流的方式(已知输出流的长度):

第2种方式:使用直接输出流的方式(未知输出流的长度):

第3种方式:本地缓存后一次性输出:

通过设置直接输出后,我传送文件的大小为M的时候也不会出现OutOfMemoryError的错误,而之前使用第3种方式进行文件流输出的时候不到M就出现了OutOfMemoryError的错误了.

Java HttpURLConnection, OutOfMemoryError去github下个afinal.jar包吧,它帮你解决了OOM问题,

小米手机从图库选择图片时,返回的URI不正确的问题 拍照或是从图库中选择/preprename=codeclass=javaprename=codeclass=javaprivatevoidselectModel(finalintid){AlertDialog.Builderbuilder=newAlertDialog.Builder(mActivity);builder.setItems(newString

[安卓]手机管家(十九)软件管理之软件锁 要对已经安装的APP加锁,也就说不能改动这个APP而要实现这个功能,可以偷巧,在要启动的APP即将启动之前,进入加锁的activity经典的功能watchdog,看看

菜鸟的安卓实习之路---如退出应用程序 如何正确的退出应用程序?1最初的方案,是建立一个activity的栈,每当有一个新的activityonCreate()的时候,就把他加入到这个栈中,在希望退出的时候

标签: HttpURLConnection的流式输出的缺陷和解决方法

本文链接地址:https://www.jiuchutong.com/biancheng/382145.html 转载请保留说明!

上一篇:AIDL:远程调用服务里的方法失败,提示取得的IBinder对象NullPointerException(远程调用call)

下一篇:小米手机从图库选择图片时,返回的URI不正确的问题(小米手机图库图标)

  • 个人向公司提供劳务,开发票
  • 出租房屋收取水电费 能计收入吗
  • 企业所得税税前扣除政策
  • 小规模印花税是季报还是月报
  • 人力资源的差额征收怎么报企业所得税
  • 有没有退股一说
  • 一般纳税人房租费的税率是多少
  • 个体工商户可以给员工交社保吗
  • 做账要不要入库单和出库单
  • 企业所得税汇总纳税分配比例
  • 代扣代缴车船税手续费比例
  • 银行存款的会计处理方法
  • 企业增加注册资本需要缴纳什么税
  • 逾期抵扣办理申请书模板
  • 出口退税转为免税
  • 企业物流运输
  • 劳动合同中的劳动报酬标准
  • 计提费用的时候可以计提税金吗
  • 分公司注销时其他应付款会计分录
  • 企业专项储备属于什么科目
  • 土地平整费计入什么科目
  • 17%和6%的票能直接抵扣吗?
  • 公账转私账可以撤销吗
  • 水产类账目怎么做
  • 中介收中介费后就不管了
  • 固定资产作为投资入股为何体现在资本公积
  • 销售外购设备并提供安装服务
  • 应收账款平均余额怎么理解
  • 建筑业增值税会计核算是哪门课的内容
  • 普通发票的进项票怎么做分录
  • 使用的磁盘空间在哪
  • 基建项目和工程项目区别
  • 基金会债券收入吗
  • 高新技术企业的申报条件包括以下哪些
  • 债务重组亏损计入
  • 最新人工智能软件chingt
  • Vue3+TypeScript+Vite如何使用require动态引入类似于图片等静态资源
  • 销售费用占销售额比例怎么算
  • 购买方红字信息表已开销售方系统查不到
  • 哪些凭证是免纳税的
  • 如何设置长期有效的二维码
  • 待处理财产损益是什么类科目借贷方向
  • 房地产企业增值税预征率
  • 什么是房地产企业?它主要具有哪些特性?
  • 应付账款账面价值扣除商业折扣吗
  • 电子商业承兑会不会拿不到钱
  • 管理费用如何核算
  • 暂估入库估多了,汇算清缴前调整
  • 固定资产清理如何做账
  • 公司利润如何
  • 建安企业增值税预缴
  • 收取加盟费的账户是什么
  • 商场收租户电费会计分录
  • 转账支票的特点有哪些
  • 结算本月职工工资,其中生产甲产品
  • 利润表中管理费用根据什么填
  • 审核通过的红字信息表可以删除吗
  • 汽车销售企业营销策略
  • sqlserver表类型
  • 安装sql server 2008硬件要求
  • windows开始菜单在哪里
  • ghost装机顺序
  • win7系统如何关闭更新系统
  • 微软被告
  • rtvscn95.exe - rtvscn95是什么进程 有什么用
  • win10系统office2007每次打开都要配置
  • linux查看系统配置内存大小
  • js new option
  • jQuery实现checkbox的简单操作
  • jquery的实现原理
  • shell脚本显示进度条
  • js设计模式有什么用
  • js 拍照
  • 菜鸟教程javaweb
  • jquerybind事件
  • 电子发票查询官网入口
  • 百旺开票人怎么把管理员改成人名
  • 摩托车的消费税率
  • 房子有注册公司可以卖吗
  • 公司迁税务所流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设