package com.zmc.io.demo;
import com.zmc.io.util.TimeUtils;
import java.io.*;
import java.net.*;
import java.text.DecimalFormat;
import java.util.UUID;
import java.util.concurrent.*;
public class FileSteamBufferDemo1 {
/**
* @param diskPath 本地磁盘路径
* @param httpUrl 远程网络文件地址
*/
public static void downLoadFromUrl(String diskPath, String httpUrl) {
int start = Integer.parseInt(TimeUtils.currTimeMs());
String path = "E:" + diskPath;
File file = new File(path);
boolean mkFlag = true;
/*如果文件夹不存在则创建*/
if (!file.isDirectory()) {
mkFlag = file.mkdirs();
}
if (mkFlag) {
/*文件夹创建成功之后,获取文件夹绝对路径*/
path = file.getAbsolutePath();
} else {
System.err.println("文件夹创建失败!");
return;
}
InputStream inputStream = null;
BufferedInputStream bufferedInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
URL url = new URL(httpUrl);
/*文件后缀*/
String fileSuffix = url.getPath().substring(url.getPath().lastIndexOf("."));
URLConnection urlConnection = url.openConnection();
/*超时时间*/
urlConnection.setConnectTimeout(10 * 1000);
/*文件字节大小*/
float byteLength = urlConnection.getContentLength();
/*inputStream=urlConnection.getInputStream();*///两种方式
inputStream = url.openStream();
bufferedInputStream = new BufferedInputStream(inputStream);
/*文件夹路径+分隔符+文件名.后缀*/
fileOutputStream = new FileOutputStream(path + File.separator + UUID.randomUUID() + fileSuffix);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
double len;
double v = 0;
byte[] bytes = new byte[1024];
/*格式化数字*/
DecimalFormat format = new DecimalFormat("#.###");
while ((len = bufferedInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, (int) len);
bufferedOutputStream.flush();
v = v + len;
System.out.println("下载进度:" + format.format(v / byteLength * 100) + "%" + "-----" + Thread.currentThread().getName());
}
int end = Integer.parseInt(TimeUtils.currTimeMs());
System.out.println(Thread.currentThread().getName() + "success!耗时:" + (end - start) + "毫秒");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bufferedInputStream != null) {
bufferedInputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
if (bufferedOutputStream != null) {
bufferedOutputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 线程池内部工具类
*/
static class TreadPoolUtils {
private static final int CORE_POOL_SIZE = 5;
private static final int MAX_POOL_SIZE = 10;
private static final int QUEUE_CAPACITY = 100;
private static final Long KEEP_ALIVE_TIME = 6L;
public TreadPoolUtils() {
}
public static Executor executor() {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_CAPACITY),
new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
public static void main(String[] args) {
Executor executor = TreadPoolUtils.executor();
for (int i = 1; i <= 3; i++) {
executor.execute(() -> {
/*拼接出本地磁盘地址*/
String diskPath = "/baosight/" + UUID.randomUUID().toString().replace("-", "");
/*qq音乐下载地址*/
String url = "https://c219154334b88393b0583619207b5908.rdt.tfogc.com:49156/dldir1.qq.com/" +
"music/clntupate/QQMusicSetup.exe?mkey=6389d829b8daecdf6028b7fc751df986&arrive_key" +
"=129003220&cip=101.228.208.232&proto=https";
downLoadFromUrl(diskPath, url);
});
}
}
}
IO流结合线程池下载远程网络文件
最新推荐文章于 2024-05-18 15:42:48 发布