要用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. java字符串比较是否都可直接使用==?

    java字符串比较,两个字符串相不相等,直接用==来判断可以吗?或者判断两个字符串不相等,直接用!=? 不能 两个对象进行比较,如果使用==符号,那么比较的是这两个对象的"引用"( ...

  2. python call函数

    call()函数本质上是将一个类的实例转换成一个函数,例如下列示例: class Sample: def __init__(self, x, y): self.x = x self.y = y def ...

  3. Hive实现网站PV分析

    原文链接: https://www.toutiao.com/i6773241257528394248/ 之前我们做过<java mapreduce实现网站PV分析>,这次我们可以用hive ...

  4. 两张Number()函数图和Boolean()函数图

  5. session反序列化

    先来了解一下关于session的一些基础知识 什么是session?在计算机中,尤其是在网络应用中,称为"会话控制".Session 对象存储特定用户会话所需的属性及配置信息.这样 ...

  6. Pop Sequeue

    题目描述 Given a stack which can keep M numbers at most. Push N numbers in the order of 1,2,3...,N and p ...

  7. 面试官问,Redis 是单线程还是多线程?我懵了

    我们平时看到介绍 Redis 的文章,都会说 Redis 是单线程的.但是我们学习的时候,比如 Redis 的 bgsave 命令,它的作用是在后台异步保存当前数据库的数据到磁盘,那既然是异步了,肯定 ...

  8. elementui-日期选择器时间清空报错踩坑

    今天在项目中遇到了这个大坑 具体问题:在日期清空时会报错 解决方法:给日期绑定的值添加监听

  9. Java对象栈上分配

    转自 https://blog.csdn.net/o9109003234/article/details/101365108 在学习Java的过程中,很多喜欢说new出来的对象分配一定在对上: 其实不 ...

  10. 比 WSL2 更香的是 Docker for windows!

    今天给大家推荐一个软件 -- "Docker for windows": 如果你对WSL2,还不熟悉,可以关注公众号或小程序看看我之前推送过的两篇文章. Docker for wi ...