Загрузка нескольких соединений Java - PullRequest
12 голосов
/ 11 февраля 2010

Я хотел бы получить совет, я начал новый проект по созданию ускорителя загрузки Java, который будет использовать несколько соединений. Я хотел знать, как лучше всего это сделать.

До сих пор я понял, что могу использовать HttpUrlConnection и использовать свойство range, но хотел знать эффективный способ сделать это. После того, как я скачаю детали из нескольких соединений, мне нужно будет объединить детали, чтобы мы получили полностью загруженный файл.

Заранее спасибо:)

Ответы [ 3 ]

11 голосов
/ 11 февраля 2010
  1. Получите длину содержимого файла для загрузки.
  2. Разделите это в соответствии с критериями (размер, скорость и hellip;).
  3. Запуск нескольких потоков для загрузки файла, начиная с разных позиций,
    и сохраните их в разных файлах: myfile.part1, myfile.part2, & hellip;
  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();
    }
}
8 голосов
/ 11 февраля 2010

Если вы хотите избежать объединения сегментов после загрузки, вы можете использовать FileChannel.
С FileChannel вы можете записывать в любую позицию файла (даже с несколькими потоками).

Таким образом, вы можете сначала выделить весь файл, а затем
запишите сегменты, к которым они принадлежат , как они входят в .

Подробнее см. На странице Javadocs .

2 голосов
/ 11 февраля 2010

JDownloader - лучший загрузчик, который я видел. Если вам интересно, это открытый исходный код, и вы наверняка многому научитесь из их кода.

...