在文件下载前,会根据已经下载的文件大小设置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();
}
}