代码之家  ›  专栏  ›  技术社区  ›  Luke

从URLConnection读取二进制文件

  •  20
  • Luke  · 技术社区  · 15 年前

    我正在尝试从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 回复  |  直到 15 年前
        1
  •  36
  •   Flow Matt McDonald    8 年前

    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();
    
        2
  •  15
  •   Stephen C    11 年前

    如果您试图读取二进制流,则不应包装 InputStream 在一个 Reader InputStream.read(byte[], int, int) 方法。然后从缓冲区写入 FileOutputStream .

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

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

    推荐文章