通过Java下载的文件无法打开
我试图打开下载的文件,但这是不可能的。例如,*.mp3不播放*.torrent有消息“不是有效的bencoding”。。怎么了?请坐通过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
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作为字符编码,并正确地实现转换,那么它们不会有损。但这真的离题了。对于二进制数据,您首先不应该执行不必要的二进制->文本->二进制转换。非常感谢您的帮助和建议。