【发布时间】:2012-03-08 13:13:28
【问题描述】:
我想获得一些关于优化我为将 StringBuilder 的全部内容写入 ServletResponse 而创建的方法的方法。
我这样做是为了避免在将其传递给 out.write() 方法之前一次性创建巨大的字符串。在我的情况下,StringBuilder 的内容长度在某些情况下会达到几百万个字符。
public static void writeResponse(ServletResponse response, StringBuilder sb) throws IOException {
try (PrintWriter out = response.getWriter()) {
int length = sb.length();
//to avoid creation of gigantic strings we are writing substrings from the sb
int bufferSize = (response.getBufferSize() != 0? response.getBufferSize():10000);
log.log(Level.INFO, "READY TO SEND To CLIENT, length of responseSB={0}", length);
if (length <= bufferSize) {
out.write(sb.toString());
} else {
int noWrites = length / bufferSize;
for (int i = 0; i < noWrites; i++) {
out.write(sb.substring(i * bufferSize, (i + 1) * bufferSize));
log.log(Level.INFO, "SENDING To CLIENT, write no={0} of {1}", new Object[]{(i + 1), noWrites});
}
int rest = length % bufferSize;
if (rest != 0) {
out.write(sb.substring(length - rest, length));
}
}
}
}
我希望它写一条(不是分块的)消息。因此,我想知道相对于字符数(或字符串的长度)建立响应缓冲区大小的准确程度如何?
目前,我正在获取当前缓冲区大小并使用它,就好像它表达了它可以容纳的多个字符一样,如何正确评估缓冲区大小?另外我没有包括标题大小,我该如何实现它?
我想将其性能优化到最大(因此它工作得最快),非常感谢任何建议。或者也许有更好的方法将巨大的 StringBuilder 内容写入 ServletResponse?
【问题讨论】:
-
我认为你不应该担心缓冲区的大小。让容器来做。
-
@mKorbel 也很高兴见到你。我知道,自从我们上次见面以来,发生了很多变化。你已经获得了 100% 以上的代表。我的祝贺。做得好。还是大部分都聚集在
swingSO 的一部分:)
标签: java jakarta-ee response stringbuilder servlet-3.0