URLConnection Java не получает весь двоичный файл - PullRequest
0 голосов
/ 21 марта 2011

В настоящее время я работаю над школой, которая включает в себя создание P2P-клиента для стандарта, который мы придумали в классе, который использует HTTP для запроса кусков двоичного файла от пиров.Нам разрешено использовать HTTP-библиотеки Java для выполнения этих запросов, однако я столкнулся с серьезной проблемой этих библиотек.Все порции файла будут обрабатываться порциями размером <= 64 КБ, но когда я использую следующий код, максимальное количество байтов, которое я получаю, составляет около 15040, даже если длина содержимого ответа составляет 64 КБ: </p>

String response = "";

URL url = new URL(uriPath);
URLConnection conn = url.openConnection ();

conn.setConnectTimeout(30 * 1000);
conn.setReadTimeout(30 * 1000);

InputStream stream = conn.getInputStream();
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

int c;
byte[] buffer = new byte[4096];

while ((c = stream.read(buffer)) != -1)
{
    byteArrayOut.write(buffer,0,c);
}

body = byteArrayOut.toByteArray();


stream.close();
result.put(Constants.HEADER_CONTENT_LENGTH, conn.getHeaderField(Constants.HEADER_CONTENT_LENGTH));
result.put(Constants.HEADER_CONTENT_CHECKSUM, conn.getHeaderField(Constants.HEADER_CONTENT_CHECKSUM));
result.put(Constants.KEY_BODY, new String(body));

Мы протестировали наш серверный компонент, и он правильно обслуживает файл при доступе к чанку с помощью wget или в браузере - этот java-клиент является единственным проблемным клиентом, который нам удалось найти.

Это проблема с классом Java URLConnection или в моем коде что-то не так с чтением двоичного файла, возвращаемого в ответе?

Примечание: я использую Java 1.6в Eclipse и из командной строки.

1 Ответ

1 голос
/ 21 марта 2011

Откуда вы знаете, что максимальное количество байтов составляет 15040? Вы byteArrayOut.toByteArray (). Length или вы сделали новую строку (byteArrayOut.toByteArray ()). Length ()?

Создание новой строки из байтового массива с двоичным содержимым может привести к непредсказуемым результатам. Используйте FileOutputStream и откройте файл.

...