Java HTTP请求缓冲区大小

4

我有一个HTTP请求分发器类,大多数情况下它都能正常工作,但是我注意到当接收较大的请求时会“停滞”。在调查问题后,我认为可能是我没有为缓冲区分配足够的字节。以前,我是这样做的:

byte[] buffer = new byte[10000];

将其更改为20000后,似乎已经停止了卡顿:

String contentType = connection.getHeaderField("Content-type");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            InputStream responseData = connection.openInputStream();
            byte[] buffer = new byte[20000];
            int bytesRead = responseData.read(buffer);
            while (bytesRead > 0) {
                baos.write(buffer, 0, bytesRead);
                bytesRead = responseData.read(buffer);
            }
            baos.close();
            connection.close();

我这样做对吗?有没有办法根据请求的大小动态设置缓冲区的字节数?

谢谢...

2个回答

3
如果您愿意使用外部库,Apache IOUtils库提供了一个toByteArray方法,可以将输入流转换为字节数组,无需进行任何额外的操作。
只需要这样简单的一行代码:
byte[] buffer = IOUtils.toByteArray(connection.openInputStream());

很不幸,我正在使用一个不太支持外部库的平台。虽然非常感谢你的帮助! - littleK

1

这是从输入到输出流的错误方式。正确的方法是:

byte[] buffer = new byte[10000];
int bytesRead = 0;
while ((bytesRead = responseData.read(buffer)) > 0) {
    baos.write(buffer, 0, bytesRead);
}

或者

byte[] buffer = new byte[10000];
for (int bytesRead = 0; (bytesRead = responseData.read(buffer)) > 0;) {
    baos.write(buffer, 0, bytesRead);
}

此外,还可以参考Sun关于该主题的教程
顺便说一下,1~2K(1024~2048)的缓冲区通常已经足够了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接