用Java模拟实现对系统文件以目录的拷贝功能
要用Java对单个文件拷贝的话,其实思路很简单,循环读取被拷贝文件,放入byte数组,然后写入目标文件。当然我们也可以借助现有的类去完成,如InputStream中的transferTo()方法就可以实现,其实我们查看源码就能看出来,其实官方的做法也是这样,只不过更严谨一些:

那么我想拷贝多个文件呢?他们显示在不同的目录中,而且目标目录中还不一定存在,比如说,
现在我想把jdk8.0的官方源码src文件复制一份到D盘,现在这个文件在桌面,里面文件结构相当复杂了

那这如何做呢?我们当然可以借助组件,一些组件很好的帮我们实现了这个功能。但我喜欢先自己做一遍。
这里我分享我的思路以及实现结果:
全部代码如下:
package day_12_15.copy_dir;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author soberw
* @Classname CopyDir
* @Description 拷贝目录(包含目录里的文件)
* @Date 2021-12-15 19:48
*/
public class CopyDir {
//存放绝对路径以及文件名
public static Map<String, String> map = new HashMap<>();
/*
思路是:
先判断被拷贝的文件是否存在,在判断拷贝的文件是否存在,不存在则创建,
然后采用递归去创建一级一级的空文件以及目录(通过Map),再一级一级去拷贝
*/
/**
* @param copyOut 被拷贝的文件(目录)
* @param copyIn 拷贝的文件(目录)
* @description: 拷贝文件或者目录(包含目录里的文件)
* @return: boolean
* @author: soberw
* @time: 2021/12/15 19:55
*/
public static boolean copyDir(File copyOut, File copyIn) {
//如果被拷贝的文件不存在直接退出
if (!copyOut.exists()) {
return false;
}
//如果目标文件存在但是是文件
if (copyIn.exists() && copyIn.isFile()) {
//如果被拷贝对象也是文件
if (copyOut.isFile()) {
copyFile(copyOut, copyIn);
return true;
} else {
//否则返回false,因为目录不能往文件中拷贝
return false;
}
} else {
//如果目标路径不存在,直接创建一个空的以便之后操作
copyIn.mkdirs();
}
//获取路径存入map
getFilePath(copyOut);
//取出key放入list
List<String> list = new ArrayList<>(map.keySet());
for (String s : list) {
// System.out.println(s);
//截取路径头尾,只保留子目录
String start = s.replace(copyOut.getAbsolutePath(), "");
String end = start.replace(map.get(s), "");
//将子目录拼接在目标路径后面
String path = copyIn.getAbsolutePath() + end;
File file = new File(path);
//创建子目录
if (!file.exists()) {
file.mkdirs();
}
//最后在拼接上文件名(map的value)
String finalPath = path + map.get(s);
// System.out.println(finalPath);
//先创建空文件
try {
new File(finalPath).createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//拷贝到空文件
copyFile(new File(s), new File(finalPath));
}
return true;
}
/**
* @param file 传入的文件
* @description: 递归读取传入文件的路径(绝对),放入Map
* @return: void
* @author: soberw
* @time: 2021/12/15 20:28
*/
private static void getFilePath(File file) {
if (file.exists()) {
if (file.isFile()) {
map.put(file.getAbsolutePath(), file.getName());
} else if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
getFilePath(f);
}
}
}
}
/**
* @param a 待复制文件路径
* @param b 复制文件路径(不存在则建立)
* @description: 将一个文件复制给另一个文件,此方法归copyDir调用
* @return: void
* @author: soberw
* @time: 2021/12/15 20:06
*/
private static void copyFile(File a, File b) {
//在copyDir()中判断过文件是否存在,所以不在判断
if (!b.exists()) {
try {
b.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try (InputStream is = new FileInputStream(a); OutputStream os = new FileOutputStream(b)) {
//实现对文件a的复制拷贝
is.transferTo(os);
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试实现,我要将src复制在这里(现在这里没有):

package day_12_15.copy_dir;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author soberw
* @Classname CopyDir
* @Description 拷贝目录(包含目录里的文件)
* @Date 2021-12-15 19:48
*/
public class CopyDirTest {
public static void main(String[] args) {
File f1 = new File("C:\\Users\\soberw\\Desktop\\src");
File f3 = new File("d:\\src");
System.out.println(CopyDir.copyDir(f1, f3));
}
}
拷贝成功!

这里给大家安利一个组件,他可以很方便的帮我们实现这些comments-io
用Java模拟实现对系统文件以目录的拷贝功能的更多相关文章
- java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱
//如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...
- EscapeAndUnescapeUtil【java模拟js的escape和unescape函数】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在这里做一个记录,基本代码同参考资料<java模拟js的escape和unescape函数>一样. 效果图 代码 ...
- MQTT介绍(3)java模拟MQTT的发布,订阅
MQTT目录: MQTT简单介绍 window安装MQTT服务器和client java模拟MQTT的发布,订阅 在此强调一下mqtt的使用场景: 1.不可靠.网络带宽小的网络 2.运行的设备CPU. ...
- Java模拟实现百度文档在线浏览
Java模拟实现百度文档在线浏览 这个思路是我参考网上而来,代码是我实现. 采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper ...
- java 模拟简单搜索
Java 模拟简单搜索 实体类 package org.dennisit.entity; /** * * * @version : 1.0 * * @author : 苏若年 <a href=& ...
- java模拟post请求发送json
java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...
- java 模拟qq源码
java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip
- Java学习-043-获取文件在目录中的路径
我们在日常的电脑使用中,经常需要在当前目录或当期目录及其子目录中查找文件,并获取相应的文件路径名.在我们的自动化测试中,也经常需要确认文件在目录中是否成功生成或已存在,因而我写了一个小方法来实现. 获 ...
- java模拟开锁
java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...
随机推荐
- Canvas原生API(纯CPU)计算并渲染三维图
Canvas原生API(纯CPU)计算并渲染三维图 前端工程师学图形学:Games101 第三次作业 利用Canvas画三维中的三角形并使用超采样实现抗锯齿 最终完成功能 Canvas 原生API实现 ...
- Swoole 中协程的使用注意事项及协程中的异常捕获
协程使用注意事项 协程内部禁止使用全局变量,以免发生数据错乱: 协程使用 use 关键字引入外部变量到当前作用域禁止使用引用,以免发生数据错乱: 不能使用类静态变量 Class::$array / 全 ...
- cpuinfo基本参数讲解
1.首先我们明确几个概念 (1)物理CPU 物理cpu数量,实际服务器中插槽上的CPU个数 实例: [root@kvm01 ~]# cat / ...
- 官网下载mysql的方法
mysql官网 http://www.mysql.com/ 方法一: (1)登陆官网 (2)把页面拉到最底部,点击Downloads(GA) 下边的MySQL Community Serv ...
- Python中去除字符串中的单个或多个空格的方法总结
python中去除字符串中空格的方法比较多,单个看起来也都比较简单 但是使用起来容易发生混淆 为了加深记忆 将常用的去除字符串中空格的方法汇总如下 方法一:strip()方法 >>> ...
- Fiddler Everywhere简单使用
重装了电脑,想装Fiddler,结果官网下载的包变成了Fiddler Everywhere,体验了下,与老版本相比,操作流程上并无太大变化,但是安装包明显变大了,而且需要登录才能操作,建议还是用老版本 ...
- sqlserver - 查出的结果集,集成为json串放在一个字段里
1.效果 2.sql SELECT top 20 (select [name] as [名字] from staffBasicInfo For JSON PATH,ROOT('第一级key')) k ...
- 论文翻译:2021_ICASSP 2021 ACOUSTIC ECHO CANCELLATION CHALLENGE: INTEGRATED ADAPTIVE ECHO CANCELLATION WITH TIME ALIGNMENT AND DEEP LEARNING-BASED RESIDUAL ECHO PLUS NOISE SUPPRESSION
论文地址:https://ieeexplore.ieee.org/abstract/document/9414462 ICASSP 2021声学回声消除挑战:结合时间对准的自适应回声消除和基于深度学习 ...
- Mysql高性能优化
一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 SQL 查询语句关联5,6张表且编写不够规范,导致 MySQL 在执行 SQL 语 ...
- 用户注册调优 及Connection对象
调优的方法: (1)减少Connection对象的销毁与创建 我们可以在服务器启动时 预先创建好二十个Connection对象 因为每次Coonection对象的创建与销毁会浪费大量的时间 我们需要 ...