使用ServletOutputStream高效地发送大量数据

时间:2009-10-28 21:45:52

标签: java servlets

对于内容类型“text / plain”,如果我必须发送大量数据,则以下哪项更有效。

ServletOutputStream sos = response.getOutputStream();

sos.write(byte[])
//or
sos.println("")

由于

3 个答案:

答案 0 :(得分:4)

这取决于您拥有源数据的格式。

如果它是一个字符串,你可能会使用response.getPrintWriter().print()获得更好的性能 - 就编码而言,它肯定会更安全。

如果它是一个字节数组,那么ServletOutputStream.write(byte[])可能是最快的,因为它不会进行任何额外的转换。

然而,对于这个和所有其他“更快”问题的真正答案是 - 衡量它: - )

答案 1 :(得分:3)

在快速查看Sun对OutputStream.write(byte[])ServletOutputStream.println(String)的实施后,我会说没有真正的区别。但正如ChssPly76所说,只能通过测量来验证。

答案 2 :(得分:1)

最有效的是编写一个InputStream(它不是ByteArrayInputStream的风格)。

仅仅因为byte []的每个字节都只占用JVM内存的一个字节,并且String的每个字符都从JVM的内存中占用了这个字节,该字符占用空间。因此,假设您有128MB的可用堆内存,“巨大的”text / plain文件大小为1.28MB,并且有100个用户同时请求该文件,那么您的应用程序将崩溃并出现OutOfMemoryError。不太专业。

在数据库或磁盘文件系统中的某处有“巨大”数据并将其作为InputStream获取“默认方式”(即通过ResultSet#getBinaryStream()从DB获取,或者通过FileInputStream从磁盘获取)并将其写入OutputStream通过bytebuffer和/或BufferedInputStream / BufferedOutputStream。

可以找到这样一个servlet的示例here

祝你好运。