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