使用多线程拷贝文件夹
生活随笔
收集整理的這篇文章主要介紹了
使用多线程拷贝文件夹
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import java.io.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 使用多線程拷貝文件夾* 不考慮目的地文件的唯一性。 不按源文件格式拷貝* 每個文件開一條線程去拷貝。最大不超過線程池數量,如果所有線程被占滿* 就等待空閑出來的線程,再提交任務** @author silence*/
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,//任務隊列,int的最大值,超過的任務,都放到等待隊列。new ArrayBlockingQueue<>(10),//線程工廠Executors.defaultThreadFactory(),//拒絕策略new ThreadPoolExecutor.AbortPolicy());}public static void main(String[] args) throws Exception {//判斷文件路徑ifFile(INFILE);//拷貝文件copyFile(INFILE);//關閉線程池thread.shutdown();}/*** 判斷源文件路徑* @param file 源文件路徑*/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);}}/*** 拷貝文件** @param file 文件路徑*/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);}}}/*** @return true 代表線程池可以接受任務,可以提交*/private static boolean ifThread() {//正在執行的線程數量int activeCount = thread.getActiveCount();//返回允許的最大線程數。int maximumPoolSize = thread.getMaximumPoolSize();//正在執行的線程數量 < 最大線程數 + 等待隊列數量6return activeCount < maximumPoolSize;}/*** 拷貝文件** @param f 文件路徑*/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);}
}
總結
以上是生活随笔為你收集整理的使用多线程拷贝文件夹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YunDetectService.exe
- 下一篇: 线程池创建