Java IO练习--输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作。
2021/9/7 20:06:55
本文主要是介绍Java IO练习--输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作。,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
package com.kj.test; import cn.hutool.core.io.IoUtil; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Collection; import java.util.Locale; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作。 */ public class FileTest10 { /** * 1、输入文件夹名称获得文件列表,可以使用之前写的类,不再重写。也可使用commons.io的方法 * 2、多线程的使用,直接在方法中新建线程 * 3、对整个文件夹复制,文件夹分隔符可以用\\或/,其他的都不对 */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入要复制的文件夹:"); String fromDir = scanner.next(); System.out.println("请输入复制文件夹存放位置:"); String toDir = scanner.next(); // 把输入地址转换为文件类型 File fromFile = new File(fromDir); File toFile = new File(toDir); // 新建线程 Thread thread = new Thread(() -> { // 判断是否为文件,是则直接复制 if (fromFile.isFile()) { System.out.println("复制单个文件"); copy(fromFile, toFile); } else { // 要复制的是文件夹 // 要防止一种无法复制的情况,如,把当前文件复制到自己的子文件夹中, // 把D:/java/jsp文件夹复制到D:/java/jsp/js文件夹里面,:这会是一个死循环,子文件夹增加的同时父文件夹也增加 // 而反过来则没事,相当于简单的覆盖 // 具体实现时,如果目标地址包含复制地址的文件夹,则不允许操作 if (toDir.replace("/", "\\").toLowerCase(Locale.ROOT) .startsWith(fromDir.replace("/", "\\").toLowerCase(Locale.ROOT))) { return; } // 复制文件,包括文件和文件夹的操作 //先获取所有的文件 Collection<File> files = FileUtils.listFiles(fromFile, null, true); // 创建一个线程池,加快复制速度 ExecutorService threadPool = Executors.newFixedThreadPool(20); for (File file : files) { // 复制文件名 String name = file.getAbsolutePath(); // 把原来的文件路径换成新的文件路径 String toName = name.replace(fromFile.getParent(), toDir + "/"); System.out.println(name + "变成了 " + toName); // 如果是文件夹,直接创建 if (file.isDirectory()) { new File(toName).mkdirs(); } else { // 如果是文件,在线程里面复制 threadPool.execute(new Runnable() { @Override public void run() { File copyFile = new File(toName); // 先要有父文件夹 copyFile.getParentFile().mkdirs(); // 开始复制文件 copy(file, copyFile); } }); } } } IoUtil.close(scanner); }); // 开启线程 thread.start(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } thread.interrupt(); } /** * 复制文件 * * @param fromFile * @param toFile */ private static void copy(File fromFile, File toFile) { // 定义一个输入流 FileInputStream fis = null; // 定义一个输出流 FileOutputStream fos = null; try { // 把复制的dir的文件,封装后赋值给输入流对象 fis = new FileInputStream(fromFile); // 把目标地址的文件,封装后,赋值给输出流对象 fos = new FileOutputStream(toFile); // 创建容器 byte[] but = new byte[1024]; int len = 0; while ((len = fis.read(but)) != -1) { // 边读边写,把输入流的内容写入输出流 fos.write(but, 0, len); } } catch (IOException e) { e.getMessage(); } finally { IoUtil.close(fis); IoUtil.close(fos); } } }
这篇关于Java IO练习--输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作。的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-06小米11i印度快充版ROM合集:极致体验,超越期待
- 2024-10-06【ROM下载】小米11i 5G 印度版系统, 疾速跃迁,定义新速度
- 2024-10-06【ROM下载】小米 11 青春活力版,青春无极限,活力全开
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求