题
我想得到一些建议,我已经开始一个新项目来创建一个将使用多个连接的 java 下载加速器。我想知道如何最好地解决这个问题。
到目前为止,我已经发现我可以使用 HttpUrlConnection 并使用 range 属性,但想知道一种有效的方法。一旦我从多个连接下载了各个部分,我就必须加入这些部分,以便我们最终得到一个完全下载的文件。
提前致谢 :)
解决方案
- 获取 内容长度 要下载的文件的名称。
- 划分 根据标准(大小、速度……)。
- 运行多个线程从不同位置开始下载文件,
并将它们保存在不同的文件中:myfile.part1
,myfile.part2
, … - 下载后,将各部分加入 一个文件.
我尝试使用以下代码来获取内容长度:
public Downloader(String path) throws IOException {
int len = 0;
URL url = new URL(path);
URLConnection connectUrl = url.openConnection();
System.out.println(len = connectUrl.getContentLength());
System.out.println(connectUrl.getContentType());
InputStream input = connectUrl.getInputStream();
int i = len;
int c = 0;
System.out.println("=== Content ===");
while (((c = input.read()) != -1) && (--i > 0)) {
System.out.print((char) c);
}
input.close();
}
这是加入文件的示例代码:
public void join(String FilePath) {
long leninfile=0, leng=0;
int count=1, data=0;
try {
File filename = new File(FilePath);
RandomAccessFile outfile = new RandomAccessFile(filename,"rw");
while(true) {
filename = new File(FilePath + count + ".sp");
if (filename.exists()) {
RandomAccessFile infile = new RandomAccessFile(filename,"r");
data=infile.read();
while(data != -1) {
outfile.write(data);
data=infile.read();
}
leng++;
infile.close();
count++;
} else break;
}
outfile.close();
} catch(Exception e) {
e.printStackTrace();
}
}
其他提示
如果你想避免下载,你可以使用的 FileChannel
。结果
随着 FileChannel
,你可以写到文件中(即使使用多个线程)。
所以,你可以先的分配的整个文件,然后点击 写在那里它们属于段,因为他们进来
请参阅 Javadoc中页对于更多的信息。
JDownloader 是我见过的最好的下载器。如果你有兴趣,它是开源的,肯定可以学到很多东西,从他们的代码。
不隶属于 StackOverflow