java将指定目录下的文件复制到目标文件夹

小咪咪 2024-03-17 00:23 235阅读 0赞

技术介绍

1. 递归

  • 递归是一种基于函数调用自身的方法。它是一种非常常见的计算机编程技术,可以让程序员通过简单、优雅的方式来解决许多问题。
  • 简单来说,递归是在函数执行过程中调用自身的过程。当函数被调用时,它会先执行函数体内的语句,然后再调用自己,这个过程将会重复执行数次,直到达到某个条件才会终止递归调用。
  • 在编程中,递归可以使一些问题的解决方法变得清晰、简洁。比如树的遍历、图的搜索以及处理嵌套数据结构等,都可以通过递归来实现。
  • 需要注意的是,如果递归没有正确的终止条件,它将会一直调用自身,直到程序崩溃。因此,在编写递归函数时,必须要特别注意控制递归的深度。

2. File

  • Java中的File是一个类,它代表着本地文件系统中的文件或目录。 File类可以用于对文件(或目录)的创建、删除、重命名、查询和修改等操作。可以通过调用File类的方法实现这些操作。File类也提供了一些便捷的方法来获取文件的属性,如文件大小、最后修改时间、是否可读、是否可写等属性。File类的一些常见方法包括:
  • createNewFile() - 创建一个新文件。
  • delete() - 删除一个文件。
  • exists() - 检查文件是否存在。
  • isFile() - 检查文件是否是一个标准文件。
  • isDirectory() - 检查文件是否是一个目录。
  • renameTo(newName) - 重命名文件/目录。
  • 另外,File类还提供了一些静态方法,如list()、listFiles()等,用于列出指定目录下的文件和子目录。而对于文本文件的读取和写入操作,则需要使用Java流(InputStream和OutputStream)来处理。

实现

首先介绍下几个小方法

1. 获取文件名

  1. public static String getFileSimpleName(File file){
  2. return file.getName().replaceAll("[\\\\/]", "");
  3. }

2. 获取文件的后缀

  1. public static String getFileType(File file) {
  2. String fileName = file.getName();
  3. int dotIndex = fileName.lastIndexOf(".");
  4. return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
  5. }

3. 拷贝文件到目标文件夹

  1. public static void copy(File sourceFile, String destinationFolder) throws IOException {
  2. String destinationFilePath = destinationFolder + "/" + getFileSimpleName(sourceFile);
  3. File file = new File(destinationFilePath);
  4. if (file.exists()){
  5. file.delete();
  6. }
  7. Files.copy(sourceFile.toPath(), file.toPath());
  8. }

4.递归查询文件

  1. public static void copyFilesRecursion(File sourceDir,String destDir,String...names) throws IOException {
  2. // 遍历源文件夹下的所有文件和文件夹
  3. for (File file : sourceDir.listFiles()) {
  4. if (file.isDirectory()) {
  5. // 如果是文件夹,递归调用 copyImages 函数
  6. copyFilesRecursion(file, destDir,names);
  7. } else if (isMateFile(file,names)) {
  8. // 如果是图片文件,拷贝到目标文件夹中
  9. copy(file,destDir);
  10. }
  11. }
  12. }

完整代码

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.nio.file.FileSystemException;
  4. import java.nio.file.Files;;
  5. import java.util.Arrays;
  6. /**
  7. * @author zzxjs
  8. * @since 2023/06/27
  9. */
  10. public class FileCopy {
  11. /**
  12. * 拷贝指定文件到目标文件夹
  13. * @param isRecursion 是否遍历子文件夹
  14. * @param source 源文件夹
  15. * @param target 目标文件夹
  16. * @param mateSuffixs 匹配的文件后缀,如果为空,只要不是文件夹都复制
  17. */
  18. public static void copyFile(boolean isRecursion,String source,String target,String...mateSuffixs) throws Exception {
  19. File sourceFile;
  20. if (!(sourceFile = file(source)).isDirectory()){
  21. throw new FileSystemException("source not directory");
  22. }
  23. File targetFile = file(target);
  24. //文件夹如果不存在则创建,存在则判断是否是目录
  25. if (targetFile.exists()){
  26. if (!targetFile.isDirectory()){
  27. throw new FileSystemException("target not directory");
  28. }
  29. }else{
  30. targetFile.mkdirs();
  31. }
  32. if (isRecursion){
  33. copyFilesRecursion(sourceFile,target,mateSuffixs);
  34. }else {
  35. copyFiles(sourceFile,target,mateSuffixs);
  36. }
  37. }
  38. /**
  39. * 创建一个File
  40. * @param path 路径
  41. */
  42. public static File file(String path){
  43. return new File(path);
  44. }
  45. /**
  46. * 递归查询文件
  47. * @param sourceDir 源文件
  48. * @param destDir 目标文件夹
  49. * @param names 匹配的后缀名
  50. */
  51. public static void copyFilesRecursion(File sourceDir,String destDir,String...names) throws IOException {
  52. // 遍历源文件夹下的所有文件和文件夹
  53. for (File file : sourceDir.listFiles()) {
  54. if (file.isDirectory()) {
  55. // 如果是文件夹,递归调用 copyImages 函数
  56. copyFilesRecursion(file, destDir,names);
  57. } else if (isMateFile(file,names)) {
  58. // 如果是图片文件,拷贝到目标文件夹中
  59. copy(file,destDir);
  60. }
  61. }
  62. }
  63. /**
  64. * 非递归查询文件
  65. * @param sourceDir 源文件
  66. * @param destDir 目标文件夹
  67. * @param names 匹配的后缀名
  68. */
  69. public static void copyFiles(File sourceDir,String destDir,String...names) throws IOException {
  70. // 遍历源文件夹下的所有文件和文件夹
  71. for (File file : sourceDir.listFiles()) {
  72. if (file.isFile() && isMateFile(sourceDir,names)) {
  73. copy(file,destDir);
  74. }
  75. }
  76. }
  77. /**
  78. * 拷贝文件到目标文件夹
  79. */
  80. public static void copy(File sourceFile, String destinationFolder) throws IOException {
  81. String destinationFilePath = destinationFolder + "/" + getFileSimpleName(sourceFile);
  82. File file = new File(destinationFilePath);
  83. if (file.exists()){
  84. file.delete();
  85. }
  86. Files.copy(sourceFile.toPath(), file.toPath());
  87. }
  88. /**
  89. * 判断文件名是否匹配
  90. * @param file 文件
  91. * @param names 需要匹配的后缀 png、doc、ppt
  92. * @return 如果没有填,则是文件就复制
  93. */
  94. public static boolean isMateFile(File file,String...names) {
  95. if (names == null || names.length == 0){
  96. return true;
  97. }
  98. return Arrays.asList(names).contains(getFileType(file).toLowerCase());
  99. }
  100. /**
  101. * 获取文件的后缀
  102. * @param file 文件 Z:\jiayi\postpartum\images\doduo.zip
  103. * @return zip
  104. */
  105. public static String getFileType(File file) {
  106. String fileName = file.getName();
  107. int dotIndex = fileName.lastIndexOf(".");
  108. return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
  109. }
  110. /**
  111. * 获取文件名
  112. * @param file Z:\jiayi\postpartum\images\doduo.zip
  113. * @return doudou.zip
  114. */
  115. public static String getFileSimpleName(File file){
  116. return file.getName().replaceAll("[\\\\/]", "");
  117. }
  118. }

发表评论

表情:
评论列表 (有 0 条评论,235人围观)

还没有评论,来说两句吧...

相关阅读