123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- package com.onemap.file.utils;
- import lombok.Data;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.nio.channels.FileChannel;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.List;
- /**
- * 文件工具
- */
- @Data
- public class FileUtils {
- private List<File> filelist;//文件列表
- private String strPath;//路径
- public FileUtils(List<File> filelist, String strPath) {
- this.filelist = filelist;
- this.strPath = strPath;
- getFileList(this.strPath);
- }
- /**
- * 获取文件列表
- *
- * @param strPath
- * @return
- */
- public List<File> getFileList(String strPath) {
- File dir = new File(strPath);
- File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
- if (files != null) {
- for (int i = 0; i < files.length; i++) {
- String fileName = files[i].getName();
- if (files[i].isDirectory()) { // 判断是文件还是文件夹
- getFileList(files[i].getAbsolutePath()); // 获取文件绝对路径
- } else { // 判断文件名
- String strFileName = files[i].getAbsolutePath();
- filelist.add(files[i]);
- }
- }
- }
- return filelist;
- }
- /**
- * 合并文件
- *
- * @param from
- * @param to
- * @throws IOException
- */
- public static void mergeFile(String from, String to) throws IOException {
- List<File> list = getAllFileAndSort(from);
- File t = new File(to);
- FileInputStream in = null;
- FileChannel inChannel = null;
- FileOutputStream out = new FileOutputStream(t, true);
- FileChannel outChannel = out.getChannel();
- File f = new File(from);
- System.out.println("f " + f.isDirectory());
- // 获取目录下的每一个文件名,再将每个文件一次写入目标文件
- if (f.isDirectory()) {
- // 记录新文件最后一个数据的位置
- long start = 0;
- for (File file : list) {
- in = new FileInputStream(file);
- inChannel = in.getChannel();
- // 从inChannel中读取file.length()长度的数据,写入outChannel的start处
- outChannel.transferFrom(inChannel, start, file.length());
- start += file.length();
- in.close();
- inChannel.close();
- }
- }
- out.close();
- outChannel.close();
- }
- /**
- * 所有文件排序
- *
- * @param dirPath 文件根目录路径
- * @return
- */
- public static List<File> getAllFileAndSort(String dirPath) {
- File dirFile = new File(dirPath);
- File[] listFiles = dirFile.listFiles();
- List<File> list = Arrays.asList(listFiles);
- Collections.sort(list, (o1, o2) -> {
- String _str = o1.getName().split("\\.")[0];
- String _num = _str.split("_")[1];
- String _str2 = o2.getName().split("\\.")[0];
- String _num2 = _str2.split("_")[1];
- return Integer.parseInt(_num) - Integer.parseInt(_num2);
- });
- return list;
- }
- /**
- * 删除文件夹
- * 删除文件夹需要把包含的文件及文件夹先删除,才能成功
- * https://blog.csdn.net/m0_57640408/article/details/120774050
- *
- * @param directory 文件夹名
- * @return 删除成功返回true, 失败返回false
- */
- public static boolean deleteDirectory(String directory) {
- // directory不以文件分隔符(/或\)结尾时,自动添加文件分隔符,不同系统下File.separator方法会自动添加相应的分隔符
- if (!directory.endsWith(File.separator)) {
- directory = directory + File.separator;
- }
- File directoryFile = new File(directory);
- // 判断directory对应的文件是否存在,或者是否是一个文件夹
- if (!directoryFile.exists() || !directoryFile.isDirectory()) {
- System.out.println("文件夹删除失败,文件夹不存在" + directory);
- return false;
- }
- boolean flag = true;
- // 删除文件夹下的所有文件和文件夹
- File[] files = directoryFile.listFiles();
- for (int i = 0; i < files.length; i++) { // 循环删除所有的子文件及子文件夹
- // 删除子文件
- if (files[i].isFile()) {
- flag = deleteFile(files[i].getAbsolutePath());
- if (!flag) {
- break;
- }
- } else { // 删除子文件夹
- flag = deleteDirectory(files[i].getAbsolutePath());
- if (!flag) {
- break;
- }
- }
- }
- if (!flag) {
- System.out.println("删除失败");
- return false;
- }
- // 最后删除当前文件夹
- if (directoryFile.delete()) {
- System.out.println("删除成功:" + directory);
- return true;
- } else {
- System.out.println("删除失败:" + directory);
- return false;
- }
- }
- /**
- * 删除文件
- *
- * @param fileName 文件名
- * @return 删除成功返回true, 失败返回false
- */
- public static boolean deleteFile(String fileName) {
- File file = new File(fileName);
- if (file.isFile() && file.exists()) {
- file.delete();
- System.out.println("删除文件成功:" + fileName);
- return true;
- } else {
- System.out.println("删除文件失败:" + fileName);
- return false;
- }
- }
- }
|