使用多线程将某个文件夹下的所有文件加密/解密
1.解析获取目录下的所有文件并进行分组
2.创建任务队列,将分组后的文件放入任务队列中
3.创建线程池
4.执行任务
5.返回结果并输出
主要实现代码:
业务实现类 DealFileServiceImpl
@Service
public class DealFileServiceImpl implements DealFileService {
private final Logger log = LoggerFactory.getLogger("DealFileServiceImpl");
@Override
public boolean dealFile(Map<String,String> addressMap, String dealFlag) {
// 1.获取指定目录下所有文件并分组
ArrayList<List<File>> allFiles = FileUtil.getAllFiles(addressMap.get("targetAddress"));
// 2.创建任务队列
List<Callable<List<File>>> taskList = new ArrayList<>();
if ("ENCRYPT".equals(dealFlag)){//加密任务队列
for (List<File> list : allFiles) {
EncryptFileThread encryptTask = new EncryptFileThread(list,addressMap);
taskList.add(encryptTask);
}
}else if ("DECRYPT".equals(dealFlag)){//解密任务队列
for (List<File> list : allFiles) {
DecryptFileThread decryptTask = new DecryptFileThread(list,addressMap);
taskList.add(decryptTask);
}
}
// 3.创建线程池
// 参数:核心线程数;最大线程数;存活时间;存活时间单位;阻塞队列
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 60,
TimeUnit.SECONDS, new LinkedBlockingDeque<>());
try {
// 4.执行任务
List<Future<List<File>>> futures = executor.invokeAll(taskList);
// 5.输出结果
for (Future<List<File>> future : futures) {
log.info("文件夹 {} 下的文件处理完毕!",future.get().get(0).getParentFile());
}
}catch (Exception e) {
e.printStackTrace();
}finally {
executor.shutdown();
}
return true;
}
}
加密线程类 EncryptFileThread
public class EncryptFileThread implements Callable<List<File>> {
private final Logger log = LoggerFactory.getLogger("EncryptFileThread");
private List<File> fileList;
private Map<String,String> addressMap;
public EncryptFileThread(List<File> fileList, Map<String, String> addressMap) {
this.fileList = fileList;
this.addressMap = addressMap;
}
@Override
public List<File> call() throws Exception {
log.info("当前线程:{},当前加密文件夹:{}", Thread.currentThread(), fileList.get(0).getParentFile());
for (File file : fileList) {
String targetFilePath = FileUtil.doPath(file.getAbsolutePath(), addressMap.get("targetAddress"));
SecureUtil.encryptFile(file.getAbsolutePath(),targetFilePath);
}
return fileList;
}
}
解密线程类 DecryptFileThread
public class DecryptFileThread implements Callable<List<File>> {
private final Logger log = LoggerFactory.getLogger("DecryptFileThread");
private List<File> fileList;
private Map<String,String> addressMap;
public DecryptFileThread(List<File> fileList, Map<String, String> addressMap) {
this.fileList = fileList;
this.addressMap = addressMap;
}
@Override
public List<File> call() throws Exception {
log.info("当前线程:{},当前解密文件夹:{}", Thread.currentThread(), fileList.get(0).getParentFile());
for (File file : fileList) {
String targetFilePath = FileUtil.doPath(file.getAbsolutePath(), addressMap.get("targetAddress"));
SecureUtil.decryptFile(file.getAbsolutePath(),targetFilePath);
}
return fileList;
}
}
11520个文件加密测试: