从URLConnection读取二进制文件

Luk*_*uke 20 java http urlconnection download

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

application/octet-stream
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

ZZ *_*der 35

我是这样做的,

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();
Run Code Online (Sandbox Code Playgroud)

  • "n> 0"测试是不必要的.根据javadocs,唯一可以返回零的情况是`buffer.length`为零. (7认同)
  • ......无论如何,零长度写入是无害的. (5认同)

Ste*_*n C 14

如果你想读一个二进制流,不应该包裹InputStreamReader任何类型的.使用该InputStream.read(byte[], int, int)方法将数据读入字节数组缓冲区.然后从缓冲区写入到FileOutputStream.

您当前正在读/写文件的方式将使用您平台的默认字符编码将其转换为"字符"并返回字节.这可能会破坏二进制数据.

(有一个字符集(LATIN-1)在字节和char值空间的子集之间提供一对一的无损映射.但是即使映射有效,这也是一个坏主意.你将翻译/复制来自和返回的二进制数据......在这种情况下byte[]无法char[]实现.)

  • @bhups-是的,但是只有在您要进行大量小读操作时,它才会有用。如果您专门进行大块读取,则BufferedInputStream实际上会稍微降低吞吐量。 (2认同)