Java JBoss输入/输出流
我与JBoss-4.2.3.GA下部署的基于Spring MVC的应用程序达成了协议,我想澄清servlet输入/输出流是如何处理大量请求/响应的。我很担心,因为我不想把整个请求/响应保存在内存中,直到调用完全完成 如何准确地检测JBoss传递给servlet的输入/输出流实现?或者我可以在某种规范中调查它的行为Java JBoss输入/输出流,java,servlets,jboss,jboss-4.2.x,Java,Servlets,Jboss,Jboss 4.2.x,我与JBoss-4.2.3.GA下部署的基于Spring MVC的应用程序达成了协议,我想澄清servlet输入/输出流是如何处理大量请求/响应的。我很担心,因为我不想把整个请求/响应保存在内存中,直到调用完全完成 如何准确地检测JBoss传递给servlet的输入/输出流实现?或者我可以在某种规范中调查它的行为 感谢您提供有关它的有用信息。servlet API默认情况下不会将整个请求和响应主体保存在内存中。这实际上是您自己的处理/解析代码实现的 至于请求正文,在处理它时,不应该将整个正文保存
感谢您提供有关它的有用信息。servlet API默认情况下不会将整个请求和响应主体保存在内存中。这实际上是您自己的处理/解析代码实现的 至于请求正文,在处理它时,不应该将整个正文保存在
字节[]
中。是的,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。这可在appserver级别和通过进行配置。当您将缓冲区大小设置得太高时,它会占用内存。servlet API默认情况下不会将整个请求和响应主体保留在内存中。这实际上是您自己的处理/解析代码实现的 至于请求正文,在处理它时,不应该将整个正文保存在
字节[]
中。是的,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。这可在appserver级别和通过进行配置。当您将缓冲区大小设置得过高时,它会占用内存