我尝试打开下载的文件,但这是不可能的。例如* .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();
}
答案 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 - 但并非总是如此。如果您使用Latin-1作为字符编码,并正确实现转换,那么它们将不会有损。但这真的不是重点。对于二进制数据,您不应该使用不必要的二进制数据 - >文字 - >首先是二元转换。