import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
-
IO流读文件,和多线程读文件 耗时对比
-
@author silence
/
public class Demo1 {
/*- 读取的文件大小
/
private static long bySum = 0;
/* - 文件夹子文件数目
/
private static int item = 0;
/* - 文件大小
*/
private static int length = 0;
private static final File FILE_1 = new File(“D:\Tlias\新建文件夹\A210300635\videosbaselesson\4084”);
private static final File FILE_2 = new File(“D:\Tlias\新建文件夹\A210300635\videosbaselesson\4993”);
public static void main(String[] args) {
//单线程
// oneThread();
//两条线程
toThread();//计算文件大小 /* sumFile(file1); System.out.println("length:" + length); System.out.println("item:" + item);*/
}
//两条线程
private static void toThread() {
//创建一个核心线程2, 最大线程5,等待时间2秒,等待人数10,默认工厂,超出拒绝,抛异常策略的线程
// 读取文件个数:376 读取文件字节数:4168706829 耗时毫秒:37118
long start = System.currentTimeMillis();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
80,
100,
2,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
//线程2
threadPoolExecutor.submit(() -> {
iofile(FILE_1);
});
//线程1
threadPoolExecutor.submit(() -> {
iofile(FILE_2);
});
//关闭线程池
threadPoolExecutor.shutdown();
while (true) {
if (threadPoolExecutor.isTerminated()) {
System.out.println(“读取文件个数:” + item);
System.out.println(“读取文件字节数:” + bySum);
long end = System.currentTimeMillis();
System.out.println(“耗时毫秒:” + (end - start));
break;
}
}
}//单线程
private static void oneThread() {
// 依次读取耗时===============耗时毫秒:38651 31936 读取文件字节数:4170441442
// file1 耗时毫秒:1843 耗时毫秒:41553
// 起始时间
long start = System.currentTimeMillis();
iofile(FILE_1);
iofile(FILE_2);
System.out.println(“读取文件个数:” + item);
System.out.println(“读取文件字节数:” + bySum);
long end = System.currentTimeMillis();
System.out.println(“耗时毫秒:” + (end - start));
}/**
- 计算这个文件夹有多少个子文件,和所有文件的大小
- @param file1 文件夹绝对路径
*/
private static void sumFile(File file1) {
File[] files = file1.listFiles();
for (File f : files) {
if (f.isFile()) {
length += f.length();
item++;
} else {
sumFile(f);
}
}
}
/**
- @param file1 递归读取
*/
private static void iofile(File file1) {
File[] files = file1.listFiles();
for (File f : files) {
if (f.isFile()) {
try {
BufferedInputStream input = new BufferedInputStream(new FileInputStream(f));
byte[] arr = new byte[1024];
int len;
while ((len = input.read(arr)) != -1) {
bySum += len;
// System.out.println(“当前已读取的字节数:” + bySum);
}
item++;
input.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
iofile(f);
}
}
}
}
- 读取的文件大小