Подтвердить что ты не робот

Загрузка нескольких Java-соединений

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

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

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

4b9b3361

Ответ 1

  • Получить длину содержимого загружаемого файла.
  • Разделить в соответствии с критериями (size, speed, & hellip;).
  • Запуск нескольких потоков для загрузки файла, начинающегося с разных позиций,
    и сохраните их в разных файлах: myfile.part1, myfile.part2, & hellip;
  • После загрузки присоедините части к одному файлу.

Я попробовал следующий код, чтобы получить длину содержимого:

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

Ответ 2

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

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

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

Ответ 3

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