FileUtils.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package com.onemap.file.utils;
  2. import lombok.Data;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.nio.channels.FileChannel;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.Collections;
  11. import java.util.List;
  12. /**
  13. * 文件工具
  14. */
  15. @Data
  16. public class FileUtils {
  17. private List<File> filelist;//文件列表
  18. private String strPath;//路径
  19. public FileUtils(List<File> filelist, String strPath) {
  20. this.filelist = filelist;
  21. this.strPath = strPath;
  22. getFileList(this.strPath);
  23. }
  24. /**
  25. * 获取文件列表
  26. *
  27. * @param strPath
  28. * @return
  29. */
  30. public List<File> getFileList(String strPath) {
  31. File dir = new File(strPath);
  32. File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
  33. if (files != null) {
  34. for (int i = 0; i < files.length; i++) {
  35. String fileName = files[i].getName();
  36. if (files[i].isDirectory()) { // 判断是文件还是文件夹
  37. getFileList(files[i].getAbsolutePath()); // 获取文件绝对路径
  38. } else { // 判断文件名
  39. String strFileName = files[i].getAbsolutePath();
  40. filelist.add(files[i]);
  41. }
  42. }
  43. }
  44. return filelist;
  45. }
  46. /**
  47. * 合并文件
  48. *
  49. * @param from
  50. * @param to
  51. * @throws IOException
  52. */
  53. public static void mergeFile(String from, String to) throws IOException {
  54. List<File> list = getAllFileAndSort(from);
  55. File t = new File(to);
  56. FileInputStream in = null;
  57. FileChannel inChannel = null;
  58. FileOutputStream out = new FileOutputStream(t, true);
  59. FileChannel outChannel = out.getChannel();
  60. File f = new File(from);
  61. System.out.println("f " + f.isDirectory());
  62. // 获取目录下的每一个文件名,再将每个文件一次写入目标文件
  63. if (f.isDirectory()) {
  64. // 记录新文件最后一个数据的位置
  65. long start = 0;
  66. for (File file : list) {
  67. in = new FileInputStream(file);
  68. inChannel = in.getChannel();
  69. // 从inChannel中读取file.length()长度的数据,写入outChannel的start处
  70. outChannel.transferFrom(inChannel, start, file.length());
  71. start += file.length();
  72. in.close();
  73. inChannel.close();
  74. }
  75. }
  76. out.close();
  77. outChannel.close();
  78. }
  79. /**
  80. * 所有文件排序
  81. *
  82. * @param dirPath 文件根目录路径
  83. * @return
  84. */
  85. public static List<File> getAllFileAndSort(String dirPath) {
  86. File dirFile = new File(dirPath);
  87. File[] listFiles = dirFile.listFiles();
  88. List<File> list = Arrays.asList(listFiles);
  89. Collections.sort(list, (o1, o2) -> {
  90. String _str = o1.getName().split("\\.")[0];
  91. String _num = _str.split("_")[1];
  92. String _str2 = o2.getName().split("\\.")[0];
  93. String _num2 = _str2.split("_")[1];
  94. return Integer.parseInt(_num) - Integer.parseInt(_num2);
  95. });
  96. return list;
  97. }
  98. /**
  99. * 删除文件夹
  100. * 删除文件夹需要把包含的文件及文件夹先删除,才能成功
  101. * https://blog.csdn.net/m0_57640408/article/details/120774050
  102. *
  103. * @param directory 文件夹名
  104. * @return 删除成功返回true, 失败返回false
  105. */
  106. public static boolean deleteDirectory(String directory) {
  107. // directory不以文件分隔符(/或\)结尾时,自动添加文件分隔符,不同系统下File.separator方法会自动添加相应的分隔符
  108. if (!directory.endsWith(File.separator)) {
  109. directory = directory + File.separator;
  110. }
  111. File directoryFile = new File(directory);
  112. // 判断directory对应的文件是否存在,或者是否是一个文件夹
  113. if (!directoryFile.exists() || !directoryFile.isDirectory()) {
  114. System.out.println("文件夹删除失败,文件夹不存在" + directory);
  115. return false;
  116. }
  117. boolean flag = true;
  118. // 删除文件夹下的所有文件和文件夹
  119. File[] files = directoryFile.listFiles();
  120. for (int i = 0; i < files.length; i++) { // 循环删除所有的子文件及子文件夹
  121. // 删除子文件
  122. if (files[i].isFile()) {
  123. flag = deleteFile(files[i].getAbsolutePath());
  124. if (!flag) {
  125. break;
  126. }
  127. } else { // 删除子文件夹
  128. flag = deleteDirectory(files[i].getAbsolutePath());
  129. if (!flag) {
  130. break;
  131. }
  132. }
  133. }
  134. if (!flag) {
  135. System.out.println("删除失败");
  136. return false;
  137. }
  138. // 最后删除当前文件夹
  139. if (directoryFile.delete()) {
  140. System.out.println("删除成功:" + directory);
  141. return true;
  142. } else {
  143. System.out.println("删除失败:" + directory);
  144. return false;
  145. }
  146. }
  147. /**
  148. * 删除文件
  149. *
  150. * @param fileName 文件名
  151. * @return 删除成功返回true, 失败返回false
  152. */
  153. public static boolean deleteFile(String fileName) {
  154. File file = new File(fileName);
  155. if (file.isFile() && file.exists()) {
  156. file.delete();
  157. System.out.println("删除文件成功:" + fileName);
  158. return true;
  159. } else {
  160. System.out.println("删除文件失败:" + fileName);
  161. return false;
  162. }
  163. }
  164. }