web-dev-qa-db-ja.com

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();
20
Luke

これが私のやり方です

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
ZZ Coder

バイナリストリームを読み取ろうとしている場合は、InputStreamReaderでラップしないでください。 InputStream.read(byte[], int, int)メソッドを使用して、データをバイト配列バッファーに読み込みます。次に、バッファからFileOutputStreamに書き込みます。

現在ファイルを読み書きしている方法は、プラットフォームのデフォルトの文字エンコーディングを使用して「文字」に変換し、バイトに戻します。これはバイナリデータを壊す傾向があります。

(バイトとchar値スペースのサブセットの間の1対1のロスレスマッピングを提供する文字セット(LATIN-1)があります。ただし、マッピングが機能する場合でも、これは悪い考えです。バイナリデータをbyte[]からchar[]に変換/コピーし、再び戻します...このコンテキストでは何も実行されません。)

14
Stephen C