13

アドバイスが欲しかったので、複数の接続を使用する Java ダウンロード アクセラレータを作成する新しいプロジェクトを開始しました。これについてどうするのが最善かを知りたかったのです。

これまでのところ、HttpUrlConnection を使用して range プロパティを使用できることがわかりましたが、これを行う効率的な方法を知りたいと思っていました。複数の接続からパーツをダウンロードしたら、完全にダウンロードされたファイルになるようにパーツを結合する必要があります。

前もって感謝します :)

4

3 に答える 3

11
  1. ダウンロードするファイルのコンテンツの長さを取得します。
  2. 基準 (サイズ、速度など) に従って分割します。
  3. 複数のスレッドを実行して、異なる位置からファイルをダウンロードし、
    それらを異なるファイルに保存します: myfile.part1、   myfile.part2、…
  4. ダウンロードしたら、パーツを1 つのファイルに結合します。

コンテンツの長さを取得するために次のコードを試しました。

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();
    }
}
于 2010-02-11T10:17:31.853 に答える
8

ダウンロード後にセグメントを結合したくない場合は、FileChannel.
を使用するFileChannelと、ファイルの任意の位置に書き込むことができます (複数のスレッドであっても)。

したがって、最初にファイル全体を割り当ててから、セグメントが入ってきた
ときに所属するセグメントを書き込むことができます。

詳細については、Javadocs ページを参照してください。

于 2010-02-11T17:05:33.977 に答える
2

JDownloaderは私が見た中で最高のダウンローダーです。興味があるなら、それはオープンソースであり、確かに彼らのコードから多くを学ぶことができます.

于 2010-02-11T08:16:56.807 に答える