Java实现文件复制功能
主要功能:
支持递归复制
支持根据关键字复制
支持排除关键字复制
复制过程中遇到同名文件,复制时会在文件名后面加_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实现文件复制功能相关推荐
- Java实现简单的文件复制功能
1.文件的复制: 从一个输入流中读取数据,然后通过输出流写入目标位置 一边读,一边写 2.代码: package com.lemon;import java.io.File; import java. ...
- java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射
http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...
- Java CSV文件读取、写入及追加
Java CSV文件读取.写入及追加 https://blog.csdn.net/liq816/article/details/81286472 追加: FileOutputStream out = ...
- 一个java删除文件夹的小方法
java删除文件夹都是从里向外删除,使用递归的方法. public class IO_FILEdemo09 {public static void main(String[] args) {// TO ...
- java大文件读写操作
转载自:http://blog.csdn.net/akon_vm/article/details/7429245 RandomAccessFile RandomAccessFile是用来访问那些保存数 ...
- Java 查看文件绝对路径,JAVA获取文件绝对路径的方法
本文实例讲述了JAVA获取文件绝对路径的方法.分享给大家供大家参考.具体实现方法如下: /** * 获取一个类的class文件所在的绝对路径. 这个类可以是JDK自身的类,也可以是用户自定义的类,或者 ...
- java编译会产生多少个类文件,编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( )...
编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( ) 更多相关问题 论述风化作用基本概念及其主要类型. 什么是药用植物 学?其 研究任务是什么 ? 庐山瀑布很有名 ...
- cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...
本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...
- 创建和应用Java包文件的两种方式
<Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1 包--package 包是Java提供的文件管理机制.包把功能相似的类,按照Java的名字 ...
- JAVA大文件上传断点续传解决方案
JAVA大文件上传断点续传解决方案 参考文章: (1)JAVA大文件上传断点续传解决方案 (2)https://www.cnblogs.com/songsu/p/11834425.html (3)ht ...
最新文章
- HTTP测试、常用编解码转换工具
- 研究生新生进入实验室后,如何成长?5点建议分享
- ETC公布2018线路图,试图追赶ETH
- python中关键字参数含义_python中接受任意关键字的参数
- chrome浏览器,调试详解,调试js、调试php、调试ajax
- 批量提取视频文件信息(文件大小及时长)并统计
- Http Only Cookie保护AccessToken
- 构建适用于Oracle 11.2.0.x的Linux单数据库实例的DataGuard
- iPhone 12性能首曝:6GB内存、A14“挤牙膏”
- 微信开发--开发模式简单配置
- Win11开机桌面假死怎么办 win11开机桌面假死的解决方法
- 微软面试题 麻将胡牌算法
- 生活技巧:过日子学着点
- matlab怎么做线性插值,[MATLAB]领域插值和线性插值
- 【bzoj4011】落忆枫音
- 数据库时间慢了14个小时,Mybatis说,这个锅我不背~
- python数学圆周率_Python编程超简单方法算圆周率
- 北海450值得入手吗?附带(越野萝莉)照片
- 纳赫鲁伯的地下城:混沌护符
- 《超效率手册》读书笔记