使用多线程拷贝文件夹
生活随笔
收集整理的這篇文章主要介紹了
使用多线程拷贝文件夹
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
import java.io.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 使用多線程拷貝文件夾* 不考慮目的地文件的唯一性。 不按源文件格式拷貝* 每個(gè)文件開一條線程去拷貝。最大不超過線程池?cái)?shù)量,如果所有線程被占滿* 就等待空閑出來的線程,再提交任務(wù)** @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;/*** 多線程,線程數(shù)*/private static final int SIZE = 100;static {thread = new ThreadPoolExecutor(//核心線程SIZE,//最大線程SIZE,//等待時(shí)間2,//等待時(shí)間單位TimeUnit.SECONDS,//任務(wù)隊(duì)列,int的最大值,超過的任務(wù),都放到等待隊(duì)列。new ArrayBlockingQueue<>(10),//線程工廠Executors.defaultThreadFactory(),//拒絕策略new ThreadPoolExecutor.AbortPolicy());}public static void main(String[] args) throws Exception {//判斷文件路徑ifFile(INFILE);//拷貝文件copyFile(INFILE);//關(guān)閉線程池thread.shutdown();}/*** 判斷源文件路徑* @param file 源文件路徑*/private static void ifFile(File file) {//如果路徑錯(cuò)誤退出if (!file.exists()) {System.out.println("文件路徑錯(cuò)誤");System.exit(1);}//必須要一個(gè)文件夾路徑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()) {//如果沒有提交滿就提交任務(wù)thread.submit(() -> {copyF(f);});break;}}} else {//遞歸copyFile(f);}}}/*** @return true 代表線程池可以接受任務(wù),可以提交*/private static boolean ifThread() {//正在執(zhí)行的線程數(shù)量int activeCount = thread.getActiveCount();//返回允許的最大線程數(shù)。int maximumPoolSize = thread.getMaximumPoolSize();//正在執(zhí)行的線程數(shù)量 < 最大線程數(shù) + 等待隊(duì)列數(shù)量6return activeCount < maximumPoolSize;}/*** 拷貝文件** @param f 文件路徑*/private static void copyF(File f) {try {System.out.println(getThreadName() + " 正在讀取:" + f.getName() + " 文件大小: " + f.length() + " 字節(jié)");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() + "文件讀取過程中發(fā)生錯(cuò)誤");e.printStackTrace();System.exit(1);}}/*** 分割線程名*/private static String getThreadName() {String name = Thread.currentThread().getName();return "線程: " + name.substring(name.lastIndexOf("-") + 1);}
}
總結(jié)
以上是生活随笔為你收集整理的使用多线程拷贝文件夹的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YunDetectService.exe
- 下一篇: 米家便携冲牙器发布:249元小魔瓶 免添