java将指定目录下的文件复制到目标文件夹
讲解递归和java的基础文件操作
·
技术介绍
1. 递归
- 递归是一种基于函数调用自身的方法。它是一种非常常见的计算机编程技术,可以让程序员通过简单、优雅的方式来解决许多问题。
- 简单来说,递归是在函数执行过程中调用自身的过程。当函数被调用时,它会先执行函数体内的语句,然后再调用自己,这个过程将会重复执行数次,直到达到某个条件才会终止递归调用。
- 在编程中,递归可以使一些问题的解决方法变得清晰、简洁。比如树的遍历、图的搜索以及处理嵌套数据结构等,都可以通过递归来实现。
- 需要注意的是,如果递归没有正确的终止条件,它将会一直调用自身,直到程序崩溃。因此,在编写递归函数时,必须要特别注意控制递归的深度。
2. File
- Java中的File是一个类,它代表着本地文件系统中的文件或目录。 File类可以用于对文件(或目录)的创建、删除、重命名、查询和修改等操作。可以通过调用File类的方法实现这些操作。File类也提供了一些便捷的方法来获取文件的属性,如文件大小、最后修改时间、是否可读、是否可写等属性。File类的一些常见方法包括:
- createNewFile() - 创建一个新文件。
- delete() - 删除一个文件。
- exists() - 检查文件是否存在。
- isFile() - 检查文件是否是一个标准文件。
- isDirectory() - 检查文件是否是一个目录。
- renameTo(newName) - 重命名文件/目录。
- 另外,File类还提供了一些静态方法,如list()、listFiles()等,用于列出指定目录下的文件和子目录。而对于文本文件的读取和写入操作,则需要使用Java流(InputStream和OutputStream)来处理。
实现
首先介绍下几个小方法
1. 获取文件名
public static String getFileSimpleName(File file){
return file.getName().replaceAll("[\\\\/]", "");
}
2. 获取文件的后缀
public static String getFileType(File file) {
String fileName = file.getName();
int dotIndex = fileName.lastIndexOf(".");
return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
}
3. 拷贝文件到目标文件夹
public static void copy(File sourceFile, String destinationFolder) throws IOException {
String destinationFilePath = destinationFolder + "/" + getFileSimpleName(sourceFile);
File file = new File(destinationFilePath);
if (file.exists()){
file.delete();
}
Files.copy(sourceFile.toPath(), file.toPath());
}
4.递归查询文件
public static void copyFilesRecursion(File sourceDir,String destDir,String...names) throws IOException {
// 遍历源文件夹下的所有文件和文件夹
for (File file : sourceDir.listFiles()) {
if (file.isDirectory()) { // 如果是文件夹,递归调用 copyImages 函数
copyFilesRecursion(file, destDir,names);
} else if (isMateFile(file,names)) { // 如果是图片文件,拷贝到目标文件夹中
copy(file,destDir);
}
}
}
完整代码
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystemException;
import java.nio.file.Files;;
import java.util.Arrays;
/**
* @author zzxjs
* @since 2023/06/27
*/
public class FileCopy {
/**
* 拷贝指定文件到目标文件夹
* @param isRecursion 是否遍历子文件夹
* @param source 源文件夹
* @param target 目标文件夹
* @param mateSuffixs 匹配的文件后缀,如果为空,只要不是文件夹都复制
*/
public static void copyFile(boolean isRecursion,String source,String target,String...mateSuffixs) throws Exception {
File sourceFile;
if (!(sourceFile = file(source)).isDirectory()){
throw new FileSystemException("source not directory");
}
File targetFile = file(target);
//文件夹如果不存在则创建,存在则判断是否是目录
if (targetFile.exists()){
if (!targetFile.isDirectory()){
throw new FileSystemException("target not directory");
}
}else{
targetFile.mkdirs();
}
if (isRecursion){
copyFilesRecursion(sourceFile,target,mateSuffixs);
}else {
copyFiles(sourceFile,target,mateSuffixs);
}
}
/**
* 创建一个File
* @param path 路径
*/
public static File file(String path){
return new File(path);
}
/**
* 递归查询文件
* @param sourceDir 源文件
* @param destDir 目标文件夹
* @param names 匹配的后缀名
*/
public static void copyFilesRecursion(File sourceDir,String destDir,String...names) throws IOException {
// 遍历源文件夹下的所有文件和文件夹
for (File file : sourceDir.listFiles()) {
if (file.isDirectory()) { // 如果是文件夹,递归调用 copyImages 函数
copyFilesRecursion(file, destDir,names);
} else if (isMateFile(file,names)) { // 如果是图片文件,拷贝到目标文件夹中
copy(file,destDir);
}
}
}
/**
* 非递归查询文件
* @param sourceDir 源文件
* @param destDir 目标文件夹
* @param names 匹配的后缀名
*/
public static void copyFiles(File sourceDir,String destDir,String...names) throws IOException {
// 遍历源文件夹下的所有文件和文件夹
for (File file : sourceDir.listFiles()) {
if (file.isFile() && isMateFile(sourceDir,names)) {
copy(file,destDir);
}
}
}
/**
* 拷贝文件到目标文件夹
*/
public static void copy(File sourceFile, String destinationFolder) throws IOException {
String destinationFilePath = destinationFolder + "/" + getFileSimpleName(sourceFile);
File file = new File(destinationFilePath);
if (file.exists()){
file.delete();
}
Files.copy(sourceFile.toPath(), file.toPath());
}
/**
* 判断文件名是否匹配
* @param file 文件
* @param names 需要匹配的后缀 png、doc、ppt
* @return 如果没有填,则是文件就复制
*/
public static boolean isMateFile(File file,String...names) {
if (names == null || names.length == 0){
return true;
}
return Arrays.asList(names).contains(getFileType(file).toLowerCase());
}
/**
* 获取文件的后缀
* @param file 文件 Z:\jiayi\postpartum\images\doduo.zip
* @return zip
*/
public static String getFileType(File file) {
String fileName = file.getName();
int dotIndex = fileName.lastIndexOf(".");
return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
}
/**
* 获取文件名
* @param file Z:\jiayi\postpartum\images\doduo.zip
* @return doudou.zip
*/
public static String getFileSimpleName(File file){
return file.getName().replaceAll("[\\\\/]", "");
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)