13

我想得到一些建议,我已经开始了一个新项目来创建一个使用多个连接的 java 下载加速器。我想知道如何最好地解决这个问题。

到目前为止,我发现我可以使用 HttpUrlConnection 并使用 range 属性,但想知道一种有效的方法。一旦我从多个连接下载了部件,我将不得不加入这些部件,以便我们最终得到一个完全下载的文件。

提前致谢 :)

4

3 回答 3

11
  1. 获取要下载的文件的内容长度
  2. 根据标准(大小、速度……)划分它。
  3. 运行多个线程从不同位置开始下载文件,
    并将它们保存在不同的文件中:myfile.part1,   myfile.part2, ...
  4. 下载后,将这些部分合并到一个文件中。

我尝试了以下代码来获取内容长度:

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();
    }
}
于 2010-02-11T10:17:31.853 回答
8

如果您想避免在下载后加入分段,您可以使用FileChannel.
使用 a FileChannel,您可以写入文件的任何位置(即使有多个线程)。

因此,您可以先分配整个文件,然后在它们进入时
写入它们所属的段。

有关更多信息,请参阅Javadocs 页面

于 2010-02-11T17:05:33.977 回答
2

JDownloader是我见过的最好的下载器。如果您有兴趣,它是开源的,您肯定可以从他们的代码中学到很多东西。

于 2010-02-11T08:16:56.807 回答