Java HTTP-запросы Размер буфера - PullRequest
3 голосов
/ 16 апреля 2010

У меня есть класс HTTP Request Dispatcher, который работает большую часть времени, но я заметил, что он "зависает" при получении больших запросов. Изучив проблему, я подумал, что, возможно, я не выделяю достаточное количество байтов для буфера. Раньше я делал:

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 голосов
/ 16 апреля 2010

Если вы открыты для использования внешних библиотек, библиотека Apache IOUtils имеет toByteArray , который преобразует входной поток в байтовый массив без какой-либо работы с вашей стороны.

Это так же просто, как:

byte[] buffer = IOUtils.toByteArray(connection.openInputStream());
1 голос
/ 16 апреля 2010

Это неправильный способ потоковой передачи от входа к выходу. Правильный путь:

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) часто более чем достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...