技術(shù)介紹
1. 遞歸
- 遞歸是一種基于函數(shù)調(diào)用自身的方法。它是一種非常常見的計(jì)算機(jī)編程技術(shù),可以讓程序員通過簡(jiǎn)單、優(yōu)雅的方式來解決許多問題。
- 簡(jiǎn)單來說,遞歸是在函數(shù)執(zhí)行過程中調(diào)用自身的過程。當(dāng)函數(shù)被調(diào)用時(shí),它會(huì)先執(zhí)行函數(shù)體內(nèi)的語句,然后再調(diào)用自己,這個(gè)過程將會(huì)重復(fù)執(zhí)行數(shù)次,直到達(dá)到某個(gè)條件才會(huì)終止遞歸調(diào)用。
- 在編程中,遞歸可以使一些問題的解決方法變得清晰、簡(jiǎn)潔。比如樹的遍歷、圖的搜索以及處理嵌套數(shù)據(jù)結(jié)構(gòu)等,都可以通過遞歸來實(shí)現(xiàn)。
- 需要注意的是,如果遞歸沒有正確的終止條件,它將會(huì)一直調(diào)用自身,直到程序崩潰。因此,在編寫遞歸函數(shù)時(shí),必須要特別注意控制遞歸的深度。
2. File
- Java中的File是一個(gè)類,它代表著本地文件系統(tǒng)中的文件或目錄。 File類可以用于對(duì)文件(或目錄)的創(chuàng)建、刪除、重命名、查詢和修改等操作。可以通過調(diào)用File類的方法實(shí)現(xiàn)這些操作。File類也提供了一些便捷的方法來獲取文件的屬性,如文件大小、最后修改時(shí)間、是否可讀、是否可寫等屬性。File類的一些常見方法包括:
- createNewFile() - 創(chuàng)建一個(gè)新文件。
- delete() - 刪除一個(gè)文件。
- exists() - 檢查文件是否存在。
- isFile() - 檢查文件是否是一個(gè)標(biāo)準(zhǔn)文件。
- isDirectory() - 檢查文件是否是一個(gè)目錄。
- renameTo(newName) - 重命名文件/目錄。
- 另外,F(xiàn)ile類還提供了一些靜態(tài)方法,如list()、listFiles()等,用于列出指定目錄下的文件和子目錄。而對(duì)于文本文件的讀取和寫入操作,則需要使用Java流(InputStream和OutputStream)來處理。
實(shí)現(xiàn)
首先介紹下幾個(gè)小方法文章來源地址http://www.zghlxwxcb.cn/news/detail-763180.html
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. 拷貝文件到目標(biāo)文件夾
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()) { // 如果是文件夾,遞歸調(diào)用 copyImages 函數(shù)
copyFilesRecursion(file, destDir,names);
} else if (isMateFile(file,names)) { // 如果是圖片文件,拷貝到目標(biāo)文件夾中
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 {
/**
* 拷貝指定文件到目標(biāo)文件夾
* @param isRecursion 是否遍歷子文件夾
* @param source 源文件夾
* @param target 目標(biāo)文件夾
* @param mateSuffixs 匹配的文件后綴,如果為空,只要不是文件夾都復(fù)制
*/
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);
//文件夾如果不存在則創(chuàng)建,存在則判斷是否是目錄
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);
}
}
/**
* 創(chuàng)建一個(gè)File
* @param path 路徑
*/
public static File file(String path){
return new File(path);
}
/**
* 遞歸查詢文件
* @param sourceDir 源文件
* @param destDir 目標(biāo)文件夾
* @param names 匹配的后綴名
*/
public static void copyFilesRecursion(File sourceDir,String destDir,String...names) throws IOException {
// 遍歷源文件夾下的所有文件和文件夾
for (File file : sourceDir.listFiles()) {
if (file.isDirectory()) { // 如果是文件夾,遞歸調(diào)用 copyImages 函數(shù)
copyFilesRecursion(file, destDir,names);
} else if (isMateFile(file,names)) { // 如果是圖片文件,拷貝到目標(biāo)文件夾中
copy(file,destDir);
}
}
}
/**
* 非遞歸查詢文件
* @param sourceDir 源文件
* @param destDir 目標(biāo)文件夾
* @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);
}
}
}
/**
* 拷貝文件到目標(biāo)文件夾
*/
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 如果沒有填,則是文件就復(fù)制
*/
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("[\\\\/]", "");
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-763180.html
到了這里,關(guān)于java將指定目錄下的文件復(fù)制到目標(biāo)文件夾的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!