有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从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();

共 (2) 个答案

  1. # 1 楼答案

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

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

    (有一个字符集(拉丁语-1),它在字节和char值空间的子集之间提供1对1的无损映射。然而,即使在映射工作时,这也是一个坏主意。您将把二进制数据从byte[]转换/复制到char[]然后再转换/复制回来。。。在这种情况下,它什么也做不到。)

  2. # 2 楼答案

    我就是这样做的

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