通过Java下载的文件无法打开

时间:2016-04-06 18:21:46

标签: java

我尝试打开下载的文件,但这是不可能的。例如* .mp3不播放* .torrent有消息"是无效的bencoding" ..什么是错的?请问好吗?

try(FileOutputStream fwriter = new FileOutputStream(save_location);){
        URL url_path = new URL(url);
        URLConnection connection = url_path.openConnection();
        InputStreamReader reader = new InputStreamReader(connection.getInputStream());
        int data;
        while((data = reader.read())!=-1)
            fwriter.write(data);
        fwriter.flush();
    }catch(IOException e){
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:1)

这就是问题所在。

代码采用输入流(二进制数据)并将其包装在阅读器(文本数据)中,使用平台的默认字符集解码器将二进制文件转换为文本。

然后它将获取这些字符,将它们截断为字节并将它们写为字节syteam。

二进制数据从字节到字符并返回字节的转换通常是 1 有损;即破坏二进制数据。当你这样做时(没有选择" safe" charset,并且后端的文本转换为字节转换),那么损坏是不可避免的。

对于记录,这里是复制二进制数据流的正确方法的草图:

URL url = new URL(urlString);
try (FileOutputStream os = new FileOutputStream(save_location);
     URLConnection connection = url.openConnection();
     InputStream is = connection.getInputStream()) {
    byte[] data = new byte[BUFFER_SIZE);
    int nosBytesRead;
    while ((nosBytesRead = is.read()) != -1) {
        os.write(data, 0, nosBytesRead);
    }
}

注意:

  1. 不会从字节转换为字符到字节
  2. 使用缓冲区进行读写操作,而不是一次使用一个字节(或字符)。
  3. 不会挤压异常。
  4. 打开输入流作为资源,以便没有潜在的资源泄漏。
  5. 1 - 但并非总是如此。如果您使用Latin-1作为字符编码,并正确实现转换,那么它们将不会有损。但这真的不是重点。对于二进制数据,您不应该使用不必要的二进制数据 - >文字 - >首先是二元转换。