2010-02-11 140 views
12

我想获得一些建议,我已经开始一个新项目来创建一个java下载加速器,它将使用多个连接。我想知道如何去做这件事。Java多重连接下载

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

感谢提前:)

+1

你的问题并不十分清楚或具体。你能澄清一下吗?谢谢 – 2010-02-11 08:31:15

+0

@全部:**问题也需要投票!** – 2011-10-18 15:27:48

回答

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

感谢Shaaf我认为这就是我正在寻找的,会给它一个bash :) – 2010-02-11 10:55:32

2

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

+0

听起来不错,让我看看它吧 – 2010-02-11 08:35:18

+0

'......当然你可以从他们的代码中学到很多东西......'不 - 只是,你甚至可以**修改**或**在您自己的程序中使用**。 (它是开源的!) – 2011-10-18 15:43:09

7

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

所以,你可以先分配整个文件,然后
写段属于他们的地方,因为他们进来

查看Javadocs page了解更多信息。

+1

+1:我认为'FileChannel'是最有效/简单的方法来做到这一点。 – 2011-10-18 15:29:43