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);}
}

使用多线程拷贝文件夹相关推荐

  1. java 多线程 压缩_Java 多线程拷贝文件夹并调用tinyPng算法接口压缩图片实现(生产消费变种)...

    线程模型 生产者Provider线程为一,主要进行深搜目录文件:. 消费者Consumer线程多个, 因为RPC服务调用时延较长, 启用多个线程请求服务. 持久化线程Persist 将已经消费的消息存 ...

  2. EVC实现拷贝文件夹下所有文件

    //======================================================================== //TITLE: //    EVC实现拷贝文件夹 ...

  3. linux拷贝文件夹怎么删除,linux文件及文件夹拷贝移动删除

    linux文件及文件夹拷贝移动删除 文件拷贝 文件夹拷贝 文件拷贝并重命名 文件夹拷贝并重命名 文件移动 文件夹移动 文件移动并重命名 文件夹移动并重命名 文件删除 文件夹删除 文件拷贝 cp tes ...

  4. java中拷贝文件的代码_拷贝文件夹中的所有文件到另外一个文件夹

    [java]代码库/** * * 拷贝文件夹中的所有文件到另外一个文件夹 * * @param srcDirector * 源文件夹 * * @param desDirector * 目标文件夹 * ...

  5. Java io流---拷贝文件夹下的所有文件和目录

    Java io流-拷贝文件夹下的所有文件和目录 代码: package demo01;import java.io.*; import java.util.TreeMap;public class C ...

  6. java 拷贝文件夹的实现

    public class CopyFiles {public static void main(String[] args) throws Exception {String src = " ...

  7. java 多线程 扫描,多线程扫描文件夹耗时方法分析

    在这里Java的方法中有线程递归,不懂得用什么方法求运行时间遇到一个有趣的问题,多线程扫描文件夹求运行时间.一般这种扫描文件夹耗时好像都是用的递归遍历一下进行计时,头一次看到这种一个文件夹一个线程的, ...

  8. Linux拷贝文件夹

    参考博文: linux下cp目录时排除一个或者多个目录的方法 1. cp cp -r 和-R功能上是等价的.不加-r或者-R的时候,只拷贝文件,不拷贝文件夹:加上后则会拷贝文件夹--包括下一级的子文件 ...

  9. java 包含文件_java 文件夹拷贝(文件夹里包含文件和文件夹) 代码

    java代码实现文件夹拷贝,文件夹可能包含文件夹和文件import java.io.BufferedReader; import java.io.File; import java.io.FileIn ...

最新文章

  1. 来聊聊可形变卷积及其应用
  2. 实验二十二 SCVMM中的SQL Server配置文件
  3. python爬虫教程网-python爬虫入门10分钟爬取一个网站
  4. redis 数据类型、命令
  5. mysql传不进去汉字,Mysql下插入汉字失败
  6. rstudio的数据集怎么建立和保存_这个40M的小工具助你在windows下处理数据如虎添翼...
  7. Error in callback for watcher “value“: “TypeError: Cannot read property ‘repalce‘ of null“
  8. 解决C#网络通信编程的阻塞问题
  9. StringUtils简单判断字符串是否为null或者空字符串
  10. 电脑主机前面的耳机插孔没声音怎么办
  11. 刷网课seleinum 小程序
  12. oppo手机解锁_oppo手机密码解锁大全【图文】
  13. 网络编程 udp学习笔记补充(帅帅老师讲堂)
  14. “金三银四” “阿里” 我去定了,谁也拦不住我,这份《Android面试宝典》说的
  15. Camera Surface 从应用到cameraserver的流转
  16. Educational Codeforces Round 49 (Rated for Div. 2)切题报告
  17. 按关键字搜索易贝商品 API
  18. 建网站论坛需要多大服务器,论坛搭建如何选择服务器
  19. Typora主题推荐及资源
  20. 南邮 OJ 1446 嘉娃的难题

热门文章

  1. java 类及对象的课后作业_JAVA类和对象课后作业
  2. 下拉选择框 其他_列表框 vs 下拉列表,哪个更好?
  3. resolv.conf
  4. 查询能力(SIP OPTIONS)
  5. 异或运算^和他的一个常用作用
  6. myeclipse mysql连接_MyEclipse连接Mysql数据库的方法(一)
  7. 怎么跟踪php代码,第九节 PHP 跟踪调试代码 XDebug
  8. dem聚类只能成为一类
  9. 【转】DICOM简述!!!!
  10. 【转】1.9 Asp.Net Core 轻松学-多线程之取消令牌(