2

これはおそらくよく聞かれる質問ですが、私はまだ正しい答えを見つけることができませんでした.

さて、私は次のコードを持っています:

java.net.URL url = new java.net.URL(built);
java.net.HttpURLConnection con = (HttpURLConnection)url.openConnection();

if (con.getResponseCode() != 200) {
    // error handle here!;
    continue;
}

// begin to download the file
int file_size = con.getContentLength();

FileOutputStream stream = new FileOutputStream(m_WorkingDir + "/" + getFilenameWithPath(i));
InputStream remoteStream = con.getInputStream();

int chunks = (int) Math.ceil((float)file_size / (float)CHUNK_SIZE);

// download each chunk
byte[] temp = new byte[CHUNK_SIZE];
for(int a = 0; a < chunks; a++) {
    // calculate chunk size
    int chunk_size = CHUNK_SIZE;

    if(a == chunks-1) {
        // last chunk
        chunk_size = file_size - a * CHUNK_SIZE;
        System.out.println("Download last chunk : " + chunk_size);
    }

    // download chunk
    int bytes = remoteStream.read(temp, 0, chunk_size);
    stream.write(temp, 0 ,chunk_size); // save to local filesystem
}

stream.close();
remoteStream.close();
con.disconnect();

このコードは、チャンクされたファイルを単にダウンロードする必要があります..しかし、ポイントは、それが正しく行われていないことです。コードをデバッグしたところ、最大 10 個のチャンクを正しく読み取ることが判明しましたが、最後のチャンクでなくても、chunk_size の半分のように読み取り、for(int a...) まで -1 を返します。終わりました。

私には、そうでなくても InputStream が EOF だと思っているようです! はい、通常のブラウザで HTTP 接続をテストしたところ、正しく動作しました。

CHUNK_SIZE の複数の設定でコードをテストしましたが、常に同じ結果が得られました。

ダウンロードしたいファイルは約10~Mbyteです..

4

1 に答える 1

4

プログラムがチャンクサイズ全体をダウンロードしていると想定していますが、Java が次のように言っているため、そうではない可能性があります。

len(CHUNK_SIZE) バイトと同じ数を読み取ろうとしますが、それより小さい数、場合によっては 0 が読み取られる可能性があります。

これはうまくいくかもしれません:-

byte[] temp = new byte[CHUNK_SIZE];
int bytes = 0;
for(int a = 0; a < chunks; a++) {
    bytes =remoteStream.read(temp, 0, CHUNK_SIZE);
    if(bytes == -1) {
      System.out.println("Downloaded last chunk : Terminating ");
      break;
    }
    stream.write(temp, 0 ,bytes);
}
于 2012-09-02T11:01:15.307 に答える