2

Android の HTTP アドレスからファイルをダウンロードするコードをまとめています。ダウンロードが途中で失敗した場合、ダウンロードの再開をサポートしたいと思います。

ダウンロードを開始し、wifi 接続を切断して数回再起動したときに得られる出力は次のとおりです。

開始サイズ 0 停止サイズ 12333416 開始サイズ 12333416 停止サイズ16058200 開始サイズ3724784

最初の再開後、部分的にダウンロードされたファイルのその後のファイル サイズの読み取り値が一致しない理由がわかりません。

前もって感謝します!

public void download(String source, String target) throws IOException {
    BufferedOutputStream outputStream = null;
    InputStream inputStream = null;

    try {
        File targetFile = new File(target);
        currentBytes = targetFile.length();

        Log.i(TAG, "Start size " + String.valueOf(currentBytes));
        outputStream = new BufferedOutputStream(new FileOutputStream(targetFile));

        // create the input stream
        URLConnection connection = (new URL(source)).openConnection();
        connection.setConnectTimeout(mCoTimeout);
        connection.setReadTimeout(mSoTimeout);

        inputStream = connection.getInputStream();
        inputStream.skip(currentBytes);

        // calculate the total bytes
        totalBytes = connection.getContentLength();

        byte[] buffer = new byte[1024];
        int bytesRead;

        while ((bytesRead = inputStream.read(buffer)) > 0) {
            // write the bytes to file
            outputStream.write(buffer, 0, bytesRead);
            outputStream.flush();

            currentBytes += bytesRead;
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (outputStream != null) {
            // close the output stream
            outputStream.flush();
            outputStream.close();
        }

        if (inputStream != null) {
            // close the input stream
            inputStream.close();
        }

        Log.i(TAG, "Stop size " + String.valueOf(currentBytes));
    }
}
4

1 に答える 1

1

あなたが間違っていることは2つあります:

  1. ファイルへのダウンロードを再開するには、ファイルを書き換えるのではなく、追加する必要があります。出力ストリームに特別なコンストラクターを使用します。

    FileOutputStream(targetFile, true)

  2. サーバーからファイルの一部を要求するには、HTTP 1.1 プロパティ「Range」を使用する必要があります。次のように実行できます。

    HttpURLConnection httpConnection = (HttpURLConnection) 接続; connection.setRequestProperty("Range", "bytes=" + currentBytes + "-");

于 2014-01-13T13:56:29.897 に答える