要用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模拟实现对系统文件以目录的拷贝功能的更多相关文章

  1. java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱

    //如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...

  2. EscapeAndUnescapeUtil【java模拟js的escape和unescape函数】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在这里做一个记录,基本代码同参考资料<java模拟js的escape和unescape函数>一样. 效果图     代码 ...

  3. MQTT介绍(3)java模拟MQTT的发布,订阅

    MQTT目录: MQTT简单介绍 window安装MQTT服务器和client java模拟MQTT的发布,订阅 在此强调一下mqtt的使用场景: 1.不可靠.网络带宽小的网络 2.运行的设备CPU. ...

  4. Java模拟实现百度文档在线浏览

    Java模拟实现百度文档在线浏览 这个思路是我参考网上而来,代码是我实现. 采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper ...

  5. java 模拟简单搜索

    Java 模拟简单搜索 实体类 package org.dennisit.entity; /** * * * @version : 1.0 * * @author : 苏若年 <a href=& ...

  6. java模拟post请求发送json

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...

  7. java 模拟qq源码

    java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip

  8. Java学习-043-获取文件在目录中的路径

    我们在日常的电脑使用中,经常需要在当前目录或当期目录及其子目录中查找文件,并获取相应的文件路径名.在我们的自动化测试中,也经常需要确认文件在目录中是否成功生成或已存在,因而我写了一个小方法来实现. 获 ...

  9. java模拟开锁

    java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...

随机推荐

  1. mysql语句1-创建库和表

    一.DDL数据定义语言 就是对书库内部的对象进行创建.删除.修改等操作的语言. 关键字:create  drop  alter 1.连接数据库 mysql -u用户名 -p -h指定主机(不指定默认是 ...

  2. YCSB_对mongodb做性能测试

    1.YCSB介绍 YCSB,全称为"Yahoo!Cloud Serving Benchmark",是雅虎开发的用来对云服务进行基础测试的工具,其内部涵盖了常见的NoSQL数据库产品 ...

  3. 初识python: 字典

    使用数据字典,编写一个多级菜单: 需求:每一级可返回上级,可退出. 多级菜单 #!/user/bin env python # author:Simple-Sir # time:20180915 # ...

  4. ES开源工具 elastichd 的使用(另一个elasticsearch可视化管理)

    1. 获取elastichd镜像 docker pull containerize/elastichd 2. 启动镜像 docker run -p 9800:9800 -d containerize/ ...

  5. 解决zabbix server is running | No 的方法

    Zabbix 的简介 Zabbix 可以监控网络和服务的运行状况,Zabbix 利用灵活的告警机制,允许用户对事件发送基于 Email 的告警.但最近在使用的时候遇到一个问题. 这篇文章主要给大家介绍 ...

  6. Visual Studio 2022(VS2022)激活密钥

    Visual Studio 2022(VS2022) 激活码: 专业版 Pro: TD244-P4NB7-YQ6XK-Y8MMM-YWV2J 企业版 Enterprise: VHF9H-NXBBB-6 ...

  7. 【刷题-LeetCode】208. Implement Trie (Prefix Tree)

    Implement Trie (Prefix Tree) Implement a trie with insert, search, and startsWith methods. Example: ...

  8. 【记录一个问题】笔记本ThinkPad X1-Extreme安装ubuntu 18后,更新nvidia显卡驱动后出现显示问题,无法再登录

    如题 更新的过程如下: sudo ubuntu-drivers autoinstall sudo reboot 后续准备在recovery模式中尝试删除驱动.

  9. cesium 3dtiles模型单体化点击高亮效果

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. c ...

  10. Scala 中下划线的用法

    1.存在性类型:Existential types def foo(l: List[Option[_]]) = ... 2.高阶类型参数:Higher kinded type parametersca ...