要用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. rocksdb代码解析-db.h

    总 这篇是对rocksdb整体功能的分析,主要着眼点是db.h文件,对rocksdb进行代码解析,若想以整体的方式了解其功能,首先就应该解析db.h文件.对于rocksdb的db.h文件来说,且不论前 ...

  2. CSS基础 装饰 元素本身隐藏和显示效果及案例

    1.visibility:hidden; 2.display: none: 区别: 1.visibility:hidden 隐藏元素本身,且在网页中 占位置 2.display:none; 隐藏元素本 ...

  3. linux 之 expect 交互操作(自动输入密码)

    场景 需要实现执行一个命令,并自动输入密码. 实现 通过expect命令实现 spawn               交互程序开始后面跟命令或者指定程序expect               获取匹 ...

  4. 详谈 Java工厂 --- 抽象工厂模式

    1.前言 感觉工厂模式都好鸡肋,还特别绕来绕去,当然,好处还是有的,将一些类似的业务都集成到工厂了, 不需要理会底层是怎么运行的,我只需要向调用工厂即可获取我要的结果,也不需要考虑工厂返回的东西类型, ...

  5. (随手记)Javascript 的parseInt函数,在IE和非IE内核浏览器运行的不同结果

    一段JS小程序: var str = "09"; var itr = parseInt(str); alert(itr); IE下运行,alert(0); 火狐和chrome下运行 ...

  6. Go语言系列之标准库os

    os包提供了操作系统的系列函数,这些接口不依赖平台.设计为Unix风格的,错误处理是go风格的:调用失败会返回错误值而非错误码.通常错误值里包含更多信息. os包的接口在所有操作系统中都是一致的.非公 ...

  7. Cookie.Session到Token和JWT

    一.session和cookie: 现在一般都是session和cookie一起用,一起提.但是他们俩其实不是一定要在一起. session的产生原因是,http协议是无状态的 这就导致了,不同的用户 ...

  8. 微信小程序配置域名的时候提示“校验文件验证失败”

    在微信小程序后台配置web-view的业务域名跟扫普通链接二维码打开小程序两项功能时, 一直提示"校验文件验证失败,请下载校验文件,上传到服务器指定的目录" 实际访问校验文件的路径 ...

  9. vue render中如何正确配置img的路径

    第一种:适用于静态路径 attrs: { src: require('../common/images/logo.png'), title: 'img' } 第二种:适用于动态路径 domProps: ...

  10. js监听url的hash变化和获取hash值

    当浏览器浏览器的url进行变化时,浏览器默认是会去服务器将相应的资源给请求下来的,在不阻止默认行为的前提下,使用给url加锚点的方式(hash模式),让浏览器不跳转. window.addEventL ...