jafea7-ctbrec-v5.3.0-based/client/src/main/java/ctbrec/ui/FileDownload.java

54 lines
1.7 KiB
Java

package ctbrec.ui;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ctbrec.io.HttpClient;
import ctbrec.recorder.ProgressListener;
import okhttp3.Request;
public class FileDownload {
private static final Logger LOG = LoggerFactory.getLogger(FileDownload.class);
private HttpClient httpClient;
private ProgressListener downloadListener;
public FileDownload(HttpClient httpClient, ProgressListener downloadListener) {
this.httpClient = httpClient;
this.downloadListener = downloadListener;
}
public void start(URL url, File target) throws IOException {
LOG.trace("Downloading file {} to {}", url, target);
var request = new Request.Builder().url(url).addHeader("connection", "keep-alive").build();
var response = httpClient.execute(request);
var fileSize = Long.parseLong(response.header("Content-Length", String.valueOf(Long.MAX_VALUE)));
InputStream in = null;
try (var fos = new FileOutputStream(target)) {
in = response.body().byteStream();
var b = new byte[1024 * 100];
long totalBytesRead = 0;
int length = -1;
while ((length = in.read(b)) >= 0) {
fos.write(b, 0, length);
totalBytesRead += length;
int progress = (int)(totalBytesRead * 100d / fileSize);
downloadListener.update(progress);
}
} finally {
if (in != null) {
in.close();
}
response.close();
}
}
}