【问题标题】:Java multiple connection downloadingJava多连接下载
【发布时间】:2010-02-11 08:15:22
【问题描述】:

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

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

提前致谢:)

【问题讨论】:

  • 您的问题不是非常清楚或具体。你能不能澄清一下。谢谢
  • @all:问题也需要投票!

标签: java download httpurlconnection


【解决方案1】:
  1. 获取要下载的文件的内容长度
  2. 根据标准(大小、速度……)划分
  3. 运行多个线程从不同位置开始下载文件,
    并将它们保存在不同的文件中:myfile.part1myfile.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();
    }
}

【讨论】:

  • 感谢 Shaaf,我认为这正是我想要的,会给它一个 bash :)
  • 我没有在您的示例方法Downloader 中看到您如何进行多流下载(使用以大写字符开头的方法名称,BTW 太糟糕了)。我本来希望看到你产生多个线程,以不同的偏移量开始下载等。我想知道为什么这个答案被接受了,因为除了理论上,它没有解决多流下载的问题。
【解决方案2】:

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

所以你可以先分配整个文件,然后
写下他们所属的片段他们进来时

请参阅Javadocs page 了解更多信息。

【讨论】:

  • +1:我认为FileChannel 是最有效/最简单的方法。
【解决方案3】:

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

【讨论】:

  • ...surely you can learn a lot from their code... 不仅,您甚至可以修改它或在您自己的程序中使用它。 (它是开源的!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多