Java代码实现断网后下载续上之前的文件进度

103 阅读1分钟

在文件下载前,会根据已经下载的文件大小设置HTTP头部信息,以便续上之前的下载进度。如果文件不存在,则从头开始下载。在下载完成后,会将下载的偏移量保存到文件中,以便下次从此处开始下载。

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class Downloader {

    private String url;
    private String fileName;

    public Downloader(String url, String fileName) {
        this.url = url;
        this.fileName = fileName;
    }

    public void download() {
        int retryCount = 0;
        long offset = 0; // 下载的偏移量
        File file = new File(fileName);
        if (file.exists()) {
            offset = file.length();
        }
        while (retryCount < 3) {
            try {
                URL downloadUrl = new URL(url);
                HttpURLConnection connection = (HttpURLConnection) downloadUrl.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(3000);
                connection.setReadTimeout(3000);
                if (offset > 0) {
                    connection.setRequestProperty("Range", "bytes=" + offset + "-");
                }
                int responseCode = connection.getResponseCode();
                if (responseCode == 206 || responseCode == 200) {
                    InputStream inputStream = connection.getInputStream();
                    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

                    RandomAccessFile randomAccessFile = new RandomAccessFile(fileName, "rw");
                    randomAccessFile.seek(offset);
                    byte[] buffer = new byte[1024];
                    int bytesRead = -1;
                    while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {
                        randomAccessFile.write(buffer, 0, bytesRead);
                        offset += bytesRead;
                    }
                    randomAccessFile.close();
                    bufferedInputStream.close();
                    System.out.println("文件下载成功!");
                    return;
                } else {
                    System.out.println("文件下载失败,错误码:" + responseCode);
                    retryCount++;
                    Thread.sleep(5000); // 等待5秒后重新尝试
                }
            } catch (IOException e) {
                System.out.println("文件下载失败,错误信息:" + e.getMessage());
                retryCount++;
                try {
                    Thread.sleep(5000); // 等待5秒后重新尝试
                } catch (InterruptedException interruptedException) {
                    interruptedException.printStackTrace();
                }
            } catch (InterruptedException interruptedException) {
                interruptedException.printStackTrace();
            }
        }
        System.out.println("文件下载失败,已超过最大重试次数。");
    }
}
public class Main {
  
  public static void main(String[] args) {
    String url = "http://example.com/file.zip";
    String fileName = "file.zip";
    
    Downloader downloader = new Downloader(url, fileName);
    downloader.download();
  }

}