Чтение двоичного файла из URLConnection - PullRequest
20 голосов
/ 11 июля 2010

Я пытаюсь прочитать двоичный файл из 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 ]

35 голосов
/ 11 июля 2010

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

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();
14 голосов
/ 11 июля 2010

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

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

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

...