import java.io.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Silence2 {private static final File INFILE = new File("D:\\Tlias\\新建文件夹\\A210300635\\videosbaselesson");private static final File OUTFILE = new File("C:\\Users\\Administrator\\Desktop\\新建22)");private static final ThreadPoolExecutor thread;private static final int SIZE = 100;static {thread = new ThreadPoolExecutor(SIZE,SIZE,2,TimeUnit.SECONDS,new ArrayBlockingQueue<>(10),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());}public static void main(String[] args) throws Exception {ifFile(INFILE);copyFile(INFILE);thread.shutdown();}private static void ifFile(File file) {if (!file.exists()) {System.out.println("文件路径错误");System.exit(1);}if (!file.isDirectory()) {System.out.println("请传入文件夹路径");System.exit(1);}File[] files = file.listFiles();if (files.length == 0) {System.out.println("不能为空文件夹");System.exit(1);}}private static void copyFile(File file) {File[] files = file.listFiles();for (File f : files) {if (f.isFile()) {while (true) {if (ifThread()) {thread.submit(() -> {copyF(f);});break;}}} else {copyFile(f);}}}private static boolean ifThread() {int activeCount = thread.getActiveCount();int maximumPoolSize = thread.getMaximumPoolSize();return activeCount < maximumPoolSize;}private static void copyF(File f) {try {System.out.println(getThreadName() + " 正在读取:" + f.getName() + " 文件大小: " + f.length() + " 字节");BufferedInputStream input = new BufferedInputStream(new FileInputStream(f));BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(OUTFILE, f.getName())));byte[] arr = new byte[1024];int len;while ((len = input.read(arr)) != -1) {out.write(arr, 0, len);}input.close();out.close();System.out.println(getThreadName() + " 完成读取:" + f.getName());} catch (Exception e) {System.out.println(getThreadName() + f.getName() + "文件读取过程中发生错误");e.printStackTrace();System.exit(1);}}private static String getThreadName() {String name = Thread.currentThread().getName();return "线程: " + name.substring(name.lastIndexOf("-") + 1);}
}