Java多连接下载

时间:2010-02-11 08:15:22

标签: java download httpurlconnection

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

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

提前致谢:)

3 个答案:

答案 0 :(得分:11)

  1. 获取要下载的文件的内容长度
  2. 根据标准(大小,速度,......)划分
  3. 运行多个线程从不同位置开始下载文件,
    并将它们保存在不同的文件中:myfile.part1myfile.part2,...
  4. 下载后,将部分加入单个文件
  5. 我尝试使用以下代码来获取内容长度:

    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();
        }
    }
    

答案 1 :(得分:8)

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

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

有关详细信息,请参阅Javadocs page

答案 2 :(得分:2)

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