文件操作工具类

文件操作工具类

  • import cn.hutool.core.collection.CollectionUtil;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
     
    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.nio.file.StandardCopyOption;
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;
     
    /**
     * @description
     **/
    public class FileUtil {
        
        /***
         * @Description:将文件路径统一转换成”C:/Users/Daasan/Desktop“格式
         * @data:[filePath]
         * @return: java.lang.String
         */
        public static String formatPath(String filePath) {
            if (StringUtils.isEmpty(filePath)){
                return "";
            }
            // 将反斜杠转为正斜杠
            filePath = filePath.replaceAll("\\\\", "/");
            // 将连续的斜杠替换为单个斜杠
            filePath = filePath.replaceAll("/{2,}", "/");
            // 如果路径以斜杠结尾,则去掉结尾的斜杠
            if (filePath.endsWith("/")) {
                filePath = filePath.substring(0, filePath.length() - 1);
            }
            return filePath;
        }
     
        /**
         **获取文件路径中的最后一级(目录或文件名称)
         * \aa\bb\cc\dd  -->  dd
         * \aa\bb\cc\dd.txt  -->  dd.txt
         * @param filePath
         * @return java.lang.String
         **/
        public static String getPathLastLevel(String filePath) {
            //判空
            if (StringUtils.isEmpty(filePath)){
                return "";
            }
            // 格式化文件路径
            filePath = formatPath(filePath);
     
            int index = filePath.lastIndexOf("/");
            if (index != -1) {
                return filePath.substring(index + 1);
            }
            return filePath;
        }
     
        /**
         **获取文件的后缀:  test.ppt  -->  ppt
         * @param fileName 文件名称
         * @return java.lang.String
         **/
        public static String getFileSuffix(String fileName) {
            if (fileName == null) {
                return null;
            }
            int index = fileName.lastIndexOf(".");
            if (index == -1) {
                return "";
            }
            return fileName.substring(index + 1);//不包含”.“
        }
     
        /**
         **获取文件的名称(去掉后缀)
         * @param fileName
         * @return java.lang.String
         **/
        public static String getFileNameWithoutSuffix(String fileName) {
            if (fileName == null) {
                return null;
            }
            int index = fileName.lastIndexOf(".");
            if (index == -1) {
                return fileName;
            }
            return fileName.substring(0, index);
        }
     
        /**
         **创建空文件
         * @param file 需创建的文件
         * @return void
         **/
        public static void createEmptyFile(File file) throws IOException {
            if (file.exists()) {
                return;
            }
            File parent = file.getParentFile();
            if (parent != null && !parent.exists()) {
                parent.mkdirs();
            }
            file.createNewFile();
        }
     
        /**
         **批量移动磁盘中的文件
         * @param rootPath 根目录
         * @param absolutePathList 存放源文件和目标文件的绝对路径
         * @return void
         **/
        public static void moveFiles(String rootPath, List<Map<String, String>> absolutePathList) throws IOException {
            for (Map<String, String> pathMap : absolutePathList) {
                String oldFilePath = pathMap.get("oldFilePath");
                String newFilePath = pathMap.get("newFilePath");
                Path sourcePath = Paths.get(formatPath(rootPath + oldFilePath));
                Path targetPath = Paths.get(formatPath(rootPath + newFilePath));
                Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
            }
        }
     
        /**
         **从网络路径中获取文件的字节数组
         * @param urlStr 文件的网络路径
         * @return byte[] 文件的字节数组
         **/
        public static byte[] getByteFromUrl(String urlStr) throws IOException {
            try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
                HttpGet httpGet = new HttpGet(urlStr);
                try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                    return EntityUtils.toByteArray(response.getEntity());
                }
            }
        }
     
        /**
         **递归获取文件夹下的所有文件和文件夹
         * @param folder
         * @return java.util.List<java.io.File>
         **/
        public static List<File> getFilesRecursively(File folder) {
            List<File> fileList = new ArrayList<>();
            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    fileList.add(file);
                    if (file.isDirectory()) {
                        fileList.addAll(getFilesRecursively(file));
                    }
                }
            }
            return fileList;
        }
     
        /**
         **去掉路径中的特殊字符
         * @param path
         * @return java.nio.file.Path
         **/
        public static Path sanitizePath(Path path) {
     
            String fileName = path.getFileName().toString();
            String parentPathString = path.getParent().toString();
     
            // 定义特殊字符的正则表达式
            Pattern pattern = Pattern.compile("[\\\\/:*?\"<>|&'+-=]");
     
            // 使用空字符串替换特殊字符
            String sanitizedFileName = pattern.matcher(fileName).replaceAll("");
     
            Path path1 = Paths.get(parentPathString, sanitizedFileName);
     
            // 返回路径的父路径与处理后的文件名拼接成的完整路径
            return path1;
        }
     
        /**
         **判断文件名称中是否包含特殊字符
         * @param fileName
         * @return boolean
         **/
        public static boolean hasSpecialCharacters(String fileName) {
            String SPECIAL_CHARACTERS_REGEX = "[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,<>\\/?]";
            Pattern pattern = Pattern.compile(SPECIAL_CHARACTERS_REGEX);
            return pattern.matcher(fileName).find();
        }
     
        /**
         **去掉文件名称中包含的特殊字符
         * @param fileName
         * @return java.lang.String
         **/
        public static String removeSpecialCharacters(String fileName) {
            String SPECIAL_CHARACTERS_REGEX = "[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,<>\\/?]";
            return fileName.replaceAll(SPECIAL_CHARACTERS_REGEX, "");
        }
     
        /**
         * 获取文件的绝对路径
         * 
         * @param filePath 文件路径
         * @return 文件的绝对路径
         */
        public static String getAbsolutePath(String filePath) {
            File file = new File(filePath);
            return file.getAbsolutePath();
        }
     
     
        /**
         * 复制文件
         * 
         * @param sourceFilePath      源文件路径
         * @param destinationFilePath 目标文件路径
         * @throws IOException 如果复制过程中出现错误,抛出 IOException
         */
        public static void copyFile(String sourceFilePath, String destinationFilePath) throws IOException {
            File sourceFile = new File(sourceFilePath);
            File destinationFile = new File(destinationFilePath);
            
            if (!sourceFile.exists()) {
                throw new FileNotFoundException("Source file does not exist: " + sourceFilePath);
            }
            
            try (InputStream inputStream = new FileInputStream(sourceFile);
                 OutputStream outputStream = new FileOutputStream(destinationFile)) {
                byte[] buffer = new byte[4096];
                int length;
                while ((length = inputStream.read(buffer)) > 0) {
                    outputStream.write(buffer, 0, length);
                }
            }
        }
     
        /**
         **修改文件的名称
         * @param filePath
         * @param newFileName
         * @return void
         **/
        public static void renameFile(String filePath, String newFileName) {
            File file = new File(filePath);
            if (file.exists()) {
                String parentPath = file.getParent();
                String newFilePath = parentPath + File.separator + newFileName;
                File newFile = new File(newFilePath);
                if (file.renameTo(newFile)) {
                    System.out.println("文件重命名成功!");
                } else {
                    System.out.println("文件重命名失败!");
                }
            } else {
                System.out.println("文件不存在!");
            }
        }
     
        /**
         **递归获取文件夹下所有文件的路径后,将路径放到filePaths中
         * @param folderPath 文件夹路径
         * @param filePaths 存放文件路径的集合
         * @return void
         **/
        public static void getAllFilePaths(String folderPath, List<String> filePaths) {
            File folder = new File(folderPath);
            // 获取文件夹下所有文件和子文件夹
            File[] files = folder.listFiles();
     
            if (files != null) {
                for (File file : files) {
                    if (file.isFile()) {
                        // 如果是文件,将文件路径添加到列表中
                        filePaths.add(file.getAbsolutePath());
                    } else if (file.isDirectory()) {
                        // 如果是文件夹,则递归调用该方法获取文件夹下所有文件路径
                        getAllFilePaths(file.getPath(), filePaths);
                    }
                }
            }
        }
     
        /**
         **将源文件夹下的所有文件复制到目标文件夹下
         * @param sourceFolderPath
         * @param targetFolderPath
         * @return void
         * @author yinqi
         * @create 2024/3/25 11:41
         **/
        public static void copyFolder(String sourceFolderPath, String targetFolderPath) throws IOException {
            File sourceFolder = new File(sourceFolderPath);
            File targetFolder = new File(targetFolderPath);
     
            // 检查源文件夹是否存在
            if (!sourceFolder.exists()) {
                throw new IllegalArgumentException("源文件夹不存在");
            }
     
            // 检查目标文件夹是否存在,如果不存在则创建
            if (!targetFolder.exists()) {
                targetFolder.mkdirs();
            }
     
            // 获取源文件夹下的所有文件和文件夹
            File[] files = sourceFolder.listFiles();
     
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        // 如果是文件夹,则递归调用copyFolder方法复制文件夹
                        copyFolder(file.getAbsolutePath(), targetFolderPath + File.separator + file.getName());
                    } else {
                        // 如果是文件,则使用Files.copy方法复制文件
                        Path sourcePath = file.toPath();
                        Path targetPath = new File(targetFolderPath + File.separator + file.getName()).toPath();
     
                        Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
                    }
                }
            }
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT枫斗者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值