5

サーバーに 40 MB のファイルがあり、次を使用してファイルをダウンロードしています

HttpURLConnection c = (HttpURLConnection) u.openConnection();
 c.setRequestMethod("GET");
 c.setDoOutput(true);
 c.connect();
 FileOutputStream f = new FileOutputStream(new File("trips.xml"));


 InputStream in = c.getInputStream();

 byte[] buffer = new byte[1024];
 int len1 = 0;
 while ( (len1 = in.read(buffer)) != -1 ) {
  f.write(buffer,0, len1);

このコードは正常に動作しているように見えますが、時間がかかりすぎます。このプロセスを高速化できる方法はありますか。

/ミンハズ

4

3 に答える 3

3

1 KB より大きい入力バッファーを使用します。バッファを空にする速度が速ければ速いほど、ネットワーク スタックはより高速にダウンロードを続行できます。これは役立つはずです:

byte[] buffer = new byte[50*1024];
于 2010-07-21T21:03:44.113 に答える
2

この非常に醜いハックは、ダウンロード時間を短縮するか、し ない可能性があります。条件の下でテストする必要があります。

複数の並列接続を (別々のスレッドで?) 開始し、それぞれが異なるデータのチャンクをダウンロードする必要があります ( HTTP 1.1 Range headerを使用)。満月があるか、太陽が出ているか、バラが咲いているかなどの多くのことに応じて、単一の接続よりもリンクを飽和させるため、より良い結果が得られる可能性があります (他のすべての人がリンクを共有することを犠牲にして、ちょっとBitTorrent が行うこと)。

于 2010-07-21T20:52:26.000 に答える
1

私は同じ問題を抱えています、このコードを思いつきました。私が試した以前のバージョンよりも速かった。ダウンロードするファイルよりも大きいバッファサイズを指定します。それが役に立てば幸い。

    public String load(String url, int bufferSize){

    try {
        URL myURL = new URL(url);
        URLConnection ucon = myURL.openConnection();
        ucon.setRequestProperty("Connection", "keep-alive");
        InputStream inputStream = ucon.getInputStream();
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(bufferSize);
        byte[] buf = new byte[bufferSize];
        int read;
        do {
            read = bufferedInputStream.read(buf, 0, buf.length);
            if (read > 0)
                byteArrayBuffer.append(buf, 0, read);
        } while (read >= 0);
        return new String(byteArrayBuffer.toByteArray());
    } catch (Exception e) {
        Log.i("Error", e.toString());
    }
    return null;
}
于 2010-07-22T04:00:56.820 に答える