要用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. 【白话科普】10s 从零看懂 H5

    最近大家有没有发现,很多微信公众号的动态内容变多了?我们常常可以看到,公众号内容中有很多动态图片甚至动画,还可以通过手指滑动切换页面,或者有一些小的点击互动. 这种看起来有点高级的小作品,其实是都是& ...

  2. mysql组织结构

    1.数据的组织结构 <1>层次型 <2>网状型 <3>关系型 2.mysql软件包格式      <1>.软件包管理器特有的格式:.rpm包      ...

  3. c# - 一个.cs类文件里如何建多个类

    方法类可以使用 internal 修饰符,意为接口类, 主函数建议添加私有修饰符 private   控制台打印

  4. POJ 2387 Til the Cows Come Home (最短路径 模版题 三种解法)

    原题链接:Til the Cows Come Home 题目大意:有  个点,给出从  点到  点的距离并且  和  是互相可以抵达的,问从  到  的最短距离. 题目分析:这是一道典型的最短路径模版 ...

  5. Typora中本地图片无法上传CSDN解决方案

    解决方法 本地图片无法上传,我们可以选择使用在线免费图床 把想要使用的图先上传到图床后复制对应的MarkDown语句到typora即可 在这里,给大家推荐一个图床 [图床链接](Image Uploa ...

  6. 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单

    不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...

  7. 【记录一个问题】tesla model 3在行驶1000公里后,行驶中踩下刹车出现告警“同时踩下制动踏板和电门”

    问题的描述如下:1.行驶1000公里左右后出现,之前没有:2.超过一定速度后再踩刹车出现此告警,如果低速环境频繁起停则不会出现:3.告警的意思是使用者同时踩下了刹车和电门,第一次电话客服反馈--检查脚 ...

  8. 前端3D引擎-Cesium自定义动态材质

    本文代码基于Vue-cli4和使用WebGL的地图引擎Cesium,主要内容为三维场景下不同对象的动态材质构建. 参考了很多文章,链接附在文末. 为不同的几何对象添加动态材质 不知道这一小节的名称概况 ...

  9. Redis数据库各种数据结构的内部实现。

    Redis数据库是一种非关系型数据库,基于key/value对,运行时加载到内存,对value支持虚拟内存, 支持多种数据结构,支持持久化,以性能著称,可用于存储,缓存,消息队列等场景.主要介绍下Re ...

  10. WebGPU图形编程(1):建立开发环境 <学习引自徐博士教程>

    首先感谢徐博士提供的视频教程,我的博客记录也是学习徐博士进行的自我总结,老徐B站学习视频链接网址:WebGPU图形编程 - 免费视频教程(1):建立开发环境_哔哩哔哩_bilibili 创建之前你需要 ...