我正在尝试从URLConnection读取二进制文件。当我用文本文件测试它似乎工作正常,但对于二进制文件它没有。发送文件时,我在服务器上使用以下mime-type:
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();
答案 0 :(得分: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();
答案 1 :(得分:14)
如果您尝试读取二进制流,则不应将InputStream
包装在任何类型的Reader
中。使用InputStream.read(byte[], int, int)
方法将数据读入字节数组缓冲区。然后从缓冲区写入FileOutputStream
。
您当前正在读/写文件的方式将使用您平台的默认字符编码将其转换为“字符”并返回字节。这可能会破坏二进制数据。
(有一个字符集(LATIN-1)在字节和char
值空间的子集之间提供一对一的无损映射。但是,即使映射有效,这也是一个坏主意你将把二进制数据从byte[]
转换/复制到char[]
再转回......这在这种情况下什么都不会实现。)