22

我正在尝试从 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();
4

2 回答 2

37

我就是这样做的

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();
于 2010-07-11T15:12:25.577 回答
15

如果您尝试读取二进制流,则不应将其包装InputStreamReader任何类型的 a 中。使用该方法将数据读入字节数组缓冲区InputStream.read(byte[], int, int)。然后从缓冲区写入到FileOutputStream.

您当前读取/写入文件的方式将使用您平台的默认字符编码将其转换为“字符”并返回字节。这很容易破坏二进制数据。

(有一个字符集(LATIN-1)提供字节和char值空间子集之间的一对一无损映射。但是,即使映射有效,这也是一个坏主意。您将翻译/复制往返byte[]的二进制数据char[]......在这种情况下没有任何成果。)

于 2010-07-11T06:18:21.367 回答