54 lines
1.7 KiB
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();
|
|
}
|
|
}
|
|
|
|
}
|