首先,抱歉我的英语不好,不是我的第一语言。 我正在编写一种从互联网下载文件的方法。我知道有几种方法可以做到这一点,但无论我使用何种方法,我的问题仍然存在。
代码应该下载一个.torrent文件,但确实如此,但是" final"文件似乎已损坏。让我引导您完成以下图片:
从网上下载的常见种子文件(使用导航器)
相同的torrent文件,但是从我的java代码下载
就我而言,下载过程出错了。 我尝试了以下两种方式,他们都下载了相同的"编码"的事情。
可能的解决方案#1 - java.nio
//Get .torrent file
public void getTorrentFile(String torrentURL, String fileName) {
try {
URL website = new URL(torrentURL);
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(fileName);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
} catch (MalformedURLException mue) { mue.printStackTrace(); }
catch (IOException ioe) {
ioe.printStackTrace(); }
}
}
*可能的解决方案#2 - 循环*
File torrentFile = new File(fileName);
URLConnection conn = new URL(torrentURL).openConnection();
conn.connect();
try (InputStream in = conn.getInputStream(); OutputStream out = new FileOutputStream(torrentFile)) {
int b = 0;
while (b != -1) {
b = in.read();
if (b != -1) {
out.write(b);
}
}
} catch (IOException ioe) { ioe.printStackTrace(); }
} catch (IOException ioe) { ioe.printStackTrace(); }
正如我之前所说,这两种解决方案都是错误的。它们对于下载文件非常有用,但是我想下载的一些种子已经损坏了。
为什么我的文件来了?#34;腐败"到我的电脑? 提前谢谢。
答案 0 :(得分:0)
您需要检查响应标头;特别是“内容类型”,“内容编码”和“传输编码”。在conn.connect()
来电之后,添加对getHeaderFields()
的通话并打印出地图内容。
根据您在那里看到的内容,您可能需要添加请求标头以告知服务器以不同方式对响应主体进行编码。
有关各种响应标头的含义的说明,请参阅HTTP 1.1 Specification。另请阅读您可以在请求中设置的“accept- *”标题。