栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Servlet:response.setContentLength()会降低下载速度

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet:response.setContentLength()会降低下载速度

也许是因为您指定的大小大于实际发送给响应的大小,并且Web浏览器基本上变得混乱并且正在等待更多数据?您知道,ZIP压缩文件并减小最终大小。

如果您不能事先有效地计算出响应的内容长度,那就不要指定它。不管怎样,servlet容器将自动以分块编码发送它。没错,这会增加一些开销,并使Web浏览器的下载进度未知,但这并不需要您先将整个响应缓存在服务器的内存中,这样您才能获得适当的最终响应内容长度。

如果您 真的 想计算最终响应内容的长度,则需要将其全部写入a

ByteArrayOutputStream
,然后
byte[]
通过其
toByteArray()
方法获取。那么实际的响应内容长度就是的长度
byte[]

ByteArrayOutputStream baos = new ByteArrayOutputStream();ZipOutputStream out = new ZipOutputStream(baos);// ...response.setContentLength(baos.size());response.getOutputStream().write(bytes);

这只会占用更多的内存,因为所有内容都将首先存储在服务器的内存中。如果多个用户同时执行此操作,并且zip输出相对较大,则您的服务器可能会有迟早会耗尽内存的风险。作为另一种选择,您可以将其写入

FileOutputStream
由创建的临时文件中
File#createTempFile()
,这样您就可以通过获取它的大小,
File#length()
并使用
FileInputStream
OutputStream
以通常的方式将其直接流式传输到响应中。这只会变慢,因为您基本上是在两次传输字节。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/422005.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号