package com.wangcen;
import java.io.*;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
/**
* 因为文件移动时是耗时io操作
* 所以线程数多一些
*/
public class FileReNameUtil {
public static String NEW_DIR = "D:\\work\\to\\";
public static CountDownLatch DOWNlATCH; //计数器
public static void main(String[] args) throws InterruptedException {
work();
}
public static void work() {
long st = System.currentTimeMillis();
File file = new File("D:\\work\\from");
File[] files = file.listFiles();
List<File> fileList = Arrays.asList(files);
System.out.println("文件总数:" + fileList.size());
//线程池
ExecutorService executorService =
new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors() * 20, //初始化线程数
fileList.size(),//最大线程数
60,
TimeUnit.SECONDS, //超时等待单位
new LinkedBlockingDeque<>(100), //可以有100个线程排队
Executors.defaultThreadFactory(),//默认线程工厂
new ThreadPoolExecutor.DiscardOldestPolicy());//队列满了,尝试和最早的竞争,不会抛出异常
DOWNlATCH = new CountDownLatch(fileList.size());
FileReNameUtil fileReNameUtil = new FileReNameUtil();
fileList.forEach(f -> {
executorService.execute(() -> {
fileReNameUtil.copyAndRename(f);
});
});
//等待所有线程执行完毕,阻塞
try {
DOWNlATCH.await();//特别注意:不要用Object的wait()
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();//关闭线程池
long ed = System.currentTimeMillis();
System.out.println("耗时:" + (ed - st));
}
public void copyAndRename(File f) {
String fname = f.getName();
if (fname.indexOf("、") > 0) {
int index = fname.indexOf("、");
String fns = fname.substring(0, index);
//处理标号
String[] fnsArr = fns.split("\\.");
int num = Integer.parseInt(fnsArr[0]);
String numStr = num + "";
if (num < 10) {
numStr = "00" + num;
} else if (num < 100) {
numStr = "0" + num;
}
String name = fname.substring(index + 1);
//处理name
if (name.indexOf("Av") > 0) {
name = fname.substring(index + 1, fname.indexOf("Av")) + ".mp4";
}
//最终的新文件名称
String newName = numStr + "_" + name;
//复制文件
try {
Files.copy(f.toPath(), new File(NEW_DIR + newName).toPath());
} catch (IOException e) {
e.printStackTrace();
}
DOWNlATCH.countDown();
}
}
}
Java 拷贝目录下很多个大文件到另外的目录并重命名
最新推荐文章于 2022-12-07 15:09:17 发布