Launcher/libLauncher/src/main/java/ru/gravit/utils/HttpDownloader.java
2018-09-22 21:34:13 +07:00

72 lines
2.4 KiB
Java

package ru.gravit.utils;
import ru.gravit.utils.helper.IOHelper;
import ru.gravit.utils.helper.LogHelper;
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.util.Observable;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class HttpDownloader extends Observable {
public static final int BUFER_SIZE = 8192;
public static final int INTERVAL = 300;
public AtomicInteger writed = new AtomicInteger(0);
private String filename;
public Thread thread;
public HttpDownloader(URL url, String file) {
Runnable run = () -> {
try {
filename = file;
downloadFile(url, file);
} catch (IOException e) {
e.printStackTrace();
}
};
Thread downloader = new Thread(run);
thread = downloader;
downloader.start();
}
public synchronized String getFilename() {
return filename;
}
public void downloadFile(URL url, String file) throws IOException {
try (BufferedInputStream in = new BufferedInputStream(url.openStream()); FileOutputStream fout = new FileOutputStream(file)) {
final byte data[] = new byte[BUFER_SIZE];
int count;
long timestamp = System.currentTimeMillis();
int writed_local = 0;
while ((count = in.read(data, 0, BUFER_SIZE)) != -1) {
fout.write(data, 0, count);
writed_local += count;
if (System.currentTimeMillis() - timestamp > INTERVAL) {
writed.set(writed_local);
LogHelper.debug("Downloaded %d", writed_local);
}
}
writed.set(writed_local);
}
}
public static void downloadZip(URL url, Path dir) throws IOException {
try (ZipInputStream input = IOHelper.newZipInput(url)) {
for (ZipEntry entry = input.getNextEntry(); entry != null; entry = input.getNextEntry()) {
if (entry.isDirectory())
continue; // Skip directories
// Unpack entry
String name = entry.getName();
LogHelper.subInfo("Downloading file: '%s'", name);
IOHelper.transfer(input, dir.resolve(IOHelper.toPath(name)));
}
}
}
}