主要功能:

支持递归复制
支持根据关键字复制
支持排除关键字复制 
复制过程中遇到同名文件,复制时会在文件名后面加_1、_2后缀
复制过程中如果目标路径不存在文件夹会自动创建


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;/*** 文件工具** @author: 向振华* @date: 2019/11/19 10:00*/
public class FileUtils {/*** 根据关键字复制** @param sourceFolderDirectory 源文件夹目录* @param targetFolderDirectory 目标文件夹目录* @param includeKeys           关键字 忽略大小写 不传参时复制所有*/public static void copyByKey(String sourceFolderDirectory, String targetFolderDirectory, String... includeKeys) {List<File> fileList = getFileList(sourceFolderDirectory, true);if (fileList == null || fileList.isEmpty()) {return;}for (File file : fileList) {boolean flag = true;for (String key : includeKeys) {if (file.getName().toLowerCase().contains(key.toLowerCase())) {flag = true;break;}flag = false;}if (flag) {copy(file.getAbsolutePath(), targetFolderDirectory);}}}/*** 排除关键字复制** @param sourceFolderDirectory 源文件夹目录* @param targetFolderDirectory 目标文件夹目录* @param excludeKeys           排除的关键字 忽略大小写 不传参时复制所有*/public static void copyWithoutKey(String sourceFolderDirectory, String targetFolderDirectory, String... excludeKeys) {List<File> fileList = getFileList(sourceFolderDirectory, true);if (fileList == null || fileList.isEmpty()) {return;}for (File file : fileList) {boolean flag = true;for (String key : excludeKeys) {if (file.getName().toLowerCase().contains(key.toLowerCase())) {flag = false;break;}}if (flag) {copy(file.getAbsolutePath(), targetFolderDirectory);}}}/*** 文件复制** @param sourceAbsolutePath    源文件路径* @param targetFolderDirectory 目标文件夹目录*/public static void copy(String sourceAbsolutePath, String targetFolderDirectory) {makeDirectory(targetFolderDirectory);String newAbsolutePath = getNewAbsolutePath(sourceAbsolutePath, targetFolderDirectory);try {FileInputStream fis = new FileInputStream(sourceAbsolutePath);FileOutputStream fos = new FileOutputStream(newAbsolutePath);byte[] datas = new byte[1024 * 8];int len;while ((len = fis.read(datas)) != -1) {fos.write(datas, 0, len);}fis.close();} catch (Exception e) {e.printStackTrace();}}/*** 如果目录不存在则创建目录** @param targetFolderDirectory*/public static void makeDirectory(String targetFolderDirectory) {String[] folderDirectories = targetFolderDirectory.split("\\\\");String temp = "";for (String folderDirectory : folderDirectories) {temp = temp + File.separator + folderDirectory;File dir = new File(temp);if (!dir.isDirectory()) {// 如果目录不存在则创建dir.mkdir();}}}/*** 获取文件夹列表** @param sourceFolderDirectory 源文件夹目录* @param isAll                 是否获取全部文件,true获取全部,false只获取路径下的文件,不包括路径下子文件夹的文件* @return 返回文件夹列表*/public static List<File> getDirectoryList(String sourceFolderDirectory, boolean isAll) {List<File> fileList = new ArrayList<>();File dir = new File(sourceFolderDirectory);// 该文件目录下文件全部放入数组File[] files = dir.listFiles();if (files == null) {return null;}for (File file : files) {if (file.isDirectory()) {fileList.add(file);if (isAll) {List<File> innerFileList = getDirectoryList(file.getAbsolutePath(), true);if (innerFileList != null && !innerFileList.isEmpty()) {fileList.addAll(innerFileList);}}}}return fileList;}/*** 获取文件列表** @param sourceFolderDirectory 源文件夹目录* @param isAll                 是否获取全部文件,true获取全部,false只获取路径下的文件,不包括路径下子文件夹的文件* @return 返回文件列表*/public static List<File> getFileList(String sourceFolderDirectory, boolean isAll) {List<File> fileList = new ArrayList<>();File dir = new File(sourceFolderDirectory);// 该文件目录下文件全部放入数组File[] files = dir.listFiles();if (files == null) {return null;}for (File file : files) {if (file.isDirectory()) {if (isAll) {List<File> innerFileList = getFileList(file.getAbsolutePath(), true);if (innerFileList != null && !innerFileList.isEmpty()) {fileList.addAll(innerFileList);}}} else if (file.isFile()) {fileList.add(file);}}return fileList;}/*** 生成新的文件名** @param sourceAbsolutePath* @param targetFolderDirectory* @return*/public static String getNewAbsolutePath(String sourceAbsolutePath, String targetFolderDirectory) {int n = 1;String[] names = getFileNames(sourceAbsolutePath);String newAbsolutePath = targetFolderDirectory + File.separator + names[0];// 循环找到不重复的文件名while (new File(newAbsolutePath).isFile()) {newAbsolutePath = targetFolderDirectory + File.separator + names[1] + "_" + n++ + names[2];}return newAbsolutePath;}/*** 将绝对路径拆分成 全名 + 文件名 + 文件扩展名 的数组** @param sourceAbsolutePath* @return*/public static String[] getFileNames(String sourceAbsolutePath) {String fileName = sourceAbsolutePath.substring(sourceAbsolutePath.lastIndexOf(File.separator) + 1);int i = fileName.lastIndexOf(".");if (i != -1) {return new String[]{fileName, fileName.substring(0, i), fileName.substring(i)};} else {return new String[]{fileName, fileName, ""};}}
}

Java实现文件复制功能相关推荐

  1. Java实现简单的文件复制功能

    1.文件的复制: 从一个输入流中读取数据,然后通过输出流写入目标位置 一边读,一边写 2.代码: package com.lemon;import java.io.File; import java. ...

  2. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...

  3. Java CSV文件读取、写入及追加

    Java CSV文件读取.写入及追加 https://blog.csdn.net/liq816/article/details/81286472 追加: FileOutputStream out = ...

  4. 一个java删除文件夹的小方法

    java删除文件夹都是从里向外删除,使用递归的方法. public class IO_FILEdemo09 {public static void main(String[] args) {// TO ...

  5. java大文件读写操作

    转载自:http://blog.csdn.net/akon_vm/article/details/7429245 RandomAccessFile RandomAccessFile是用来访问那些保存数 ...

  6. Java 查看文件绝对路径,JAVA获取文件绝对路径的方法

    本文实例讲述了JAVA获取文件绝对路径的方法.分享给大家供大家参考.具体实现方法如下: /** * 获取一个类的class文件所在的绝对路径. 这个类可以是JDK自身的类,也可以是用户自定义的类,或者 ...

  7. java编译会产生多少个类文件,编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( )...

    编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( ) 更多相关问题 论述风化作用基本概念及其主要类型. 什么是药用植物 学?其 研究任务是什么 ? 庐山瀑布很有名 ...

  8. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  9. 创建和应用Java包文件的两种方式

    <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package       包是Java提供的文件管理机制.包把功能相似的类,按照Java的名字 ...

  10. JAVA大文件上传断点续传解决方案

    JAVA大文件上传断点续传解决方案 参考文章: (1)JAVA大文件上传断点续传解决方案 (2)https://www.cnblogs.com/songsu/p/11834425.html (3)ht ...

最新文章

  1. HTTP测试、常用编解码转换工具
  2. 研究生新生进入实验室后,如何成长?5点建议分享
  3. ETC公布2018线路图,试图追赶ETH
  4. python中关键字参数含义_python中接受任意关键字的参数
  5. chrome浏览器,调试详解,调试js、调试php、调试ajax
  6. 批量提取视频文件信息(文件大小及时长)并统计
  7. Http Only Cookie保护AccessToken
  8. 构建适用于Oracle 11.2.0.x的Linux单数据库实例的DataGuard
  9. iPhone 12性能首曝:6GB内存、A14“挤牙膏”
  10. 微信开发--开发模式简单配置
  11. Win11开机桌面假死怎么办 win11开机桌面假死的解决方法
  12. 微软面试题 麻将胡牌算法
  13. 生活技巧:过日子学着点
  14. matlab怎么做线性插值,[MATLAB]领域插值和线性插值
  15. 【bzoj4011】落忆枫音
  16. 数据库时间慢了14个小时,Mybatis说,这个锅我不背~
  17. python数学圆周率_Python编程超简单方法算圆周率
  18. 北海450值得入手吗?附带(越野萝莉)照片
  19. 纳赫鲁伯的地下城:混沌护符
  20. 《超效率手册》读书笔记

热门文章

  1. 家庭网络布线图与布线方案
  2. MyEclipse详细使用教程
  3. Quartz插件配置-005
  4. LoadRunner11破解方法
  5. “奔跑吧”大数据!河北大数据产业“跑”向升级路
  6. 后台查询到前台所需,数据结构转换的通用方法(三) 地图-色斑图的对接
  7. 不用找,你想要的餐饮酒店word模板素材都在这里
  8. 《Java开发实战经典》习题第3章第12题:使用for循环打印下面的图形(用for循环打印金字塔)
  9. SQL语句优化常见方法
  10. fd 句柄_文件描述符FD的含义/文件句柄