Чтение двоичного файла от URLConnection

Я пытаюсь считать двоичный файл из URLConnection. Когда я тестирую его с текстовым файлом, это, кажется, хорошо работает, но для двоичных файлов это не делает. Я использую следующий тип пантомимы на сервере, когда файл, отошлите:

application/octet-stream

Но до сих пор ничто, кажется, не работает. Это - код, который я использую для получения файла:

file = File.createTempFile( "tempfile", ".bin");
file.deleteOnExit();

URL url = new URL( "http://somedomain.com/image.gif" );

URLConnection connection = url.openConnection();

BufferedReader input = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );

Writer writer = new OutputStreamWriter( new FileOutputStream( file ) );

int c;

while( ( c = input.read() ) != -1 ) {

   writer.write( (char)c );
}

writer.close();

input.close();
20
задан Luke 11 July 2010 в 05:33
поделиться

2 ответа

Вот как я это делаю,

input = connection.getInputStream();
byte[] buffer = new byte[4096];
int n;

OutputStream output = new FileOutputStream( file );
while ((n = input.read(buffer)) != -1) 
{
    output.write(buffer, 0, n);
}
output.close();
35
ответ дан 29 November 2019 в 23:19
поделиться

Если вы пытаетесь прочитать двоичный поток, вы НЕ должны заключать InputStream в Reader любого типа. Считайте данные в буфер массива байтов с помощью метода InputStream.read (byte [], int, int) . Затем запишите из буфера в FileOutputStream .

Текущий способ чтения / записи файла преобразует его в «символы» и обратно в байты с использованием кодировки символов по умолчанию для вашей платформы. Это может привести к искажению двоичных данных.

(Существует кодировка (LATIN-1), которая обеспечивает преобразование без потерь 1 в 1 между байтами и подмножеством пространства значений char . Однако это плохая идея, даже если отображение работает. Вы будете переводить / копировать двоичные данные из byte [] в char [] и обратно ... что в данном контексте ничего не даст.)

14
ответ дан 29 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: