从URLConnection读取二进制文件

我正在尝试从URLConnection读取二进制文件。 当我用文本文件测试它似乎工作正常,但对于二进制文件它没有。 发送文件时,我在服务器上使用以下mime-type:

application/octet-stream 

但到目前为止似乎没有任何效果。 这是我用来接收文件的代码:

 file = File.createTempFile( "tempfile", ".bin"); file.deleteOnExit(); URL url = new URL( "http://sofzh.miximages.com/java/f" ); 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(); 

我是这样做的,

 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)在字节和char值空间的子集之间提供一对一的无损映射。但是即使映射有效,这也是一个坏主意。你将翻译/复制从byte[]char[]的二进制数据再次返回……在此上下文中没有任何结果。)