Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java下载的文件无法打开_Java - Fatal编程技术网

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

通过Java下载的文件无法打开,java,Java,我试图打开下载的文件,但这是不可能的。例如,*.mp3不播放*.torrent有消息“不是有效的bencoding”。。怎么了?请坐 try(FileOutputStream fwriter = new FileOutputStream(save_location);){ URL url_path = new URL(url); URLConnection connection = url_path.openConnection(); InputS

我试图打开下载的文件,但这是不可能的。例如,*.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();
    }
问题出在这里

代码获取输入流(二进制数据)并将其包装到读取器(文本数据)中,使用平台的默认字符集解码器执行二进制到文本的转换

然后,它将这些字符截断为字节,并将它们作为字节组写入

二进制数据从字节到字符再到字节的转换通常是有损的;i、 破坏二进制数据。当您这样做时(没有选择“安全”字符集,并且后端有一个中断的文本到字节转换),那么损坏是不可避免的

以下是复制二进制数据流的正确方法的示意图:

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-但并非总是如此。如果您使用拉丁语-1作为字符编码,并正确地实现转换,那么它们不会有损。但这真的离题了。对于二进制数据,您首先不应该执行不必要的二进制->文本->二进制转换。

    非常感谢您的帮助和建议。