我与在JBoss-4.2.3.GA下部署的基于Spring MVC的应用程序打交道,并想阐明Servlet输入/输出流如何与庞大的请求/响应主体一起工作。我很烦,因为在调用将完全完成之前,不想将整个请求/响应都保留在内存中。

如何准确检测JBoss传递给servlet的输入/输出流实现?还是我可以按照某种规范研究它的行为?

感谢您提供任何有用的信息。

最佳答案

缺省情况下,Servlet API不会将整个请求和响应主体保留在内存中。有效地是您自己的处理/解析代码。

至于请求正文,在处理它时,请勿将整个正文放在byte[]中。是的,byte[]的每个字节占用Java内存的一个字节。您应该尝试(重新)编写代码,以使其永远不会将整个主体保存在内存中。例如逐行处理或逐个缓冲区处理和/或立即将其流式传输到OutputStream

例如。当身体是基于角色的:

BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(someOutputStream, "UTF-8"));

for (String line; (line = reader.readLine()) != null;) {
    processIfNecessary(line);
    writer.writeln(line);
}


或主体是基于字节的:

BufferedInputStream input = new BufferedInputStream(request.getInputStream());
BufferedOutputStream output = new BufferedOutputStream(someOutputStream);
byte[] buffer = new byte[1024]; // 1KB buffer.

for (int length; (length = input.read(buffer)) > 0;) {
    processIfNecessary(buffer);
    output.write(buffer, 0, length);
}


至于响应主体,它将一直保存在内存中,直到缓冲区大小为止。超出缓冲区大小的所有内容都将被刷新。默认缓冲区大小通常为2KB。这可以在应用服务器级别和ServletResponse#setBufferSize()上配置。当您将缓冲区大小设置得太大时,它将占用内存。

关于java - JBoss输入/输出流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5502321/

10-09 13:07