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

你做错了两件事:

  1. 要恢复下载到文件,您应该追加,而不是重写文件。对输出流使用特殊的构造函数:

    文件输出流(目标文件,真)

  2. 要从服务器请求部分文件,您应该使用 HTTP 1.1 属性“范围”。你可以这样做:

    HttpURLConnection httpConnection = (HttpURLConnection) 连接;connection.setRequestProperty("范围", "bytes=" + currentBytes + "-");

于 2014-01-13T13:56:29.897 回答