Чтение двоичного файла из URLConnection
Я пытаюсь прочитать двоичный файл из URLConnection. Когда я тестирую его с текстовым файлом, он работает нормально, но для двоичных файлов это не так. Я использую следующий тип mime на сервере, когда файл отправляется:
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();
Ответы
Ответ 1
Вот как я это делаю,
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();
Ответ 2
Если вы пытаетесь прочитать двоичный поток, вы НЕ должны обернуть InputStream
в Reader
любого типа. Прочитайте данные в буфере массива байтов, используя метод InputStream.read(byte[], int, int)
. Затем напишите из буфера в FileOutputStream
.
То, как вы в настоящее время читаете/записываете файл, преобразует его в "символы" и обратно в байты, используя кодировку символов по умолчанию для платформы. Это может привести к искажению двоичных данных.
(Существует кодировка (LATIN-1), которая обеспечивает сопоставление без потерь между байтами и подмножеством пространства значений char
. Однако это плохая идея, даже когда отображение работает. будет преобразовывать/копировать двоичные данные от byte[]
до char[]
и обратно..., которые ничего не добиваются в этом контексте.)