293 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
		
		
			
		
	
	
			293 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
|  | package io.dataease.utils;
 | |||
|  | 
 | |||
|  | import io.dataease.exception.DEException;
 | |||
|  | import org.springframework.lang.NonNull;
 | |||
|  | import org.springframework.util.Assert;
 | |||
|  | import org.springframework.web.multipart.MultipartFile;
 | |||
|  | 
 | |||
|  | import java.io.*;
 | |||
|  | import java.nio.channels.FileChannel;
 | |||
|  | import java.nio.file.Files;
 | |||
|  | import java.nio.file.Path;
 | |||
|  | import java.util.Arrays;
 | |||
|  | import java.util.List;
 | |||
|  | import java.util.stream.Collectors;
 | |||
|  | 
 | |||
|  | public class FileUtils {
 | |||
|  | 
 | |||
|  |     public static void createIfAbsent(@NonNull Path path) throws IOException {
 | |||
|  |         Assert.notNull(path, "Path must not be null");
 | |||
|  | 
 | |||
|  |         if (Files.notExists(path)) {
 | |||
|  |             // Create directories
 | |||
|  |             Files.createDirectories(path);
 | |||
|  |             LogUtil.debug("Created directory: [{}]", path);
 | |||
|  |         }
 | |||
|  |     }
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     /**
 | |||
|  |      * Java文件操作 获取不带扩展名的文件名
 | |||
|  |      */
 | |||
|  |     public static String getFileNameNoEx(String filename) {
 | |||
|  |         if ((filename != null) && (filename.length() > 0)) {
 | |||
|  |             int dot = filename.lastIndexOf('.');
 | |||
|  |             if ((dot > -1) && (dot < (filename.length()))) {
 | |||
|  |                 return filename.substring(0, dot);
 | |||
|  |             }
 | |||
|  |         }
 | |||
|  |         return filename;
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     /**
 | |||
|  |      * 获取文件扩展名,不带 .
 | |||
|  |      */
 | |||
|  |     public static String getExtensionName(String filename) {
 | |||
|  |         if ((filename != null) && (filename.length() > 0)) {
 | |||
|  |             int dot = filename.lastIndexOf('.');
 | |||
|  |             if ((dot > -1) && (dot < (filename.length() - 1))) {
 | |||
|  |                 return filename.substring(dot + 1);
 | |||
|  |             }
 | |||
|  |         }
 | |||
|  |         return filename;
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static void validateExist(String path) {
 | |||
|  |         File dir = new File(path);
 | |||
|  |         if (dir.exists()) return;
 | |||
|  |         dir.mkdirs();
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     /**
 | |||
|  |      * 将文件名解析成文件的上传路径
 | |||
|  |      */
 | |||
|  |     public static File upload(MultipartFile file, String filePath) {
 | |||
|  |         String name = getFileNameNoEx(file.getOriginalFilename());
 | |||
|  |         String suffix = getExtensionName(file.getOriginalFilename());
 | |||
|  |         try {
 | |||
|  |             validateExist(filePath);
 | |||
|  |             String fileName = name + "." + suffix;
 | |||
|  |             String path = filePath + fileName;
 | |||
|  |             // getCanonicalFile 可解析正确各种路径
 | |||
|  |             File dest = new File(path).getCanonicalFile();
 | |||
|  | 
 | |||
|  |             // 文件写入
 | |||
|  |             FileOutputStream fileOutputStream = new FileOutputStream(dest);
 | |||
|  |             fileOutputStream.write(file.getBytes());
 | |||
|  |             fileOutputStream.flush();
 | |||
|  |             fileOutputStream.close();
 | |||
|  |             return dest;
 | |||
|  |         } catch (Exception e) {
 | |||
|  |             LogUtil.error(e.getMessage(), e);
 | |||
|  |         }
 | |||
|  |         return null;
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static void copyFolder(String sourcePath, String targetPath) throws Exception {
 | |||
|  |         //源文件夹路径
 | |||
|  |         File sourceFile = new File(sourcePath);
 | |||
|  |         //目标文件夹路径
 | |||
|  |         File targetFile = new File(targetPath);
 | |||
|  | 
 | |||
|  |         if (!sourceFile.exists()) {
 | |||
|  |             throw new Exception("文件夹不存在");
 | |||
|  |         }
 | |||
|  |         if (!sourceFile.isDirectory()) {
 | |||
|  |             throw new Exception("源文件夹不是目录");
 | |||
|  |         }
 | |||
|  |         if (!targetFile.exists()) {
 | |||
|  |             targetFile.mkdirs();
 | |||
|  |         }
 | |||
|  |         if (!targetFile.isDirectory()) {
 | |||
|  |             throw new Exception("目标文件夹不是目录");
 | |||
|  |         }
 | |||
|  | 
 | |||
|  |         File[] files = sourceFile.listFiles();
 | |||
|  |         if (files == null || files.length == 0) {
 | |||
|  |             return;
 | |||
|  |         }
 | |||
|  | 
 | |||
|  |         for (File file : files) {
 | |||
|  |             //文件要移动的路径
 | |||
|  |             String movePath = targetFile + File.separator + file.getName();
 | |||
|  |             if (file.isDirectory()) {
 | |||
|  |                 //如果是目录则递归调用
 | |||
|  |                 copyFolder(file.getAbsolutePath(), movePath);
 | |||
|  |             } else {
 | |||
|  |                 //如果是文件则复制文件
 | |||
|  |                 BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
 | |||
|  |                 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(movePath));
 | |||
|  | 
 | |||
|  |                 byte[] b = new byte[1024];
 | |||
|  |                 int temp = 0;
 | |||
|  |                 while ((temp = in.read(b)) != -1) {
 | |||
|  |                     out.write(b, 0, temp);
 | |||
|  |                 }
 | |||
|  |                 out.close();
 | |||
|  |                 in.close();
 | |||
|  |             }
 | |||
|  |         }
 | |||
|  |     }
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     public static String copy(File source, String targetDir) throws IOException {
 | |||
|  |         String name = source.getName();
 | |||
|  |         String destPath = null;
 | |||
|  |         if (targetDir.endsWith("/") || targetDir.endsWith("\\")) {
 | |||
|  |             destPath = targetDir + name;
 | |||
|  |         } else {
 | |||
|  |             destPath = targetDir + "/" + name;
 | |||
|  |         }
 | |||
|  |         File DestFile = new File(destPath);
 | |||
|  |         if (!DestFile.getParentFile().exists()) {
 | |||
|  |             DestFile.getParentFile().mkdirs();
 | |||
|  |         }
 | |||
|  |         copyFileUsingFileChannels(source, DestFile);
 | |||
|  |         return destPath;
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     private static void copyFileUsingFileChannels(File source, File dest) throws IOException {
 | |||
|  |         FileChannel inputChannel = null;
 | |||
|  |         FileChannel outputChannel = null;
 | |||
|  |         try {
 | |||
|  |             inputChannel = new FileInputStream(source).getChannel();
 | |||
|  |             outputChannel = new FileOutputStream(dest).getChannel();
 | |||
|  |             outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
 | |||
|  |         } finally {
 | |||
|  |             inputChannel.close();
 | |||
|  |             outputChannel.close();
 | |||
|  |         }
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static String readJson(File file) {
 | |||
|  |         String str = null;
 | |||
|  |         try {
 | |||
|  |             FileReader fileReader = new FileReader(file);
 | |||
|  |             Reader reader = new InputStreamReader(new FileInputStream(file), "utf-8");
 | |||
|  |             int ch = 0;
 | |||
|  |             StringBuffer sb = new StringBuffer();
 | |||
|  |             while ((ch = reader.read()) != -1) {
 | |||
|  |                 sb.append((char) ch);
 | |||
|  |             }
 | |||
|  |             fileReader.close();
 | |||
|  |             reader.close();
 | |||
|  |             str = sb.toString();
 | |||
|  |             return str;
 | |||
|  |         } catch (Exception e) {
 | |||
|  |             e.printStackTrace();
 | |||
|  |             return null;
 | |||
|  |         }
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static void deleteFile(String path) {
 | |||
|  |         File file = new File(path);
 | |||
|  |         if (file.exists()) {
 | |||
|  |             if (file.isDirectory()) {
 | |||
|  |                 Arrays.stream(file.listFiles()).forEach(item -> deleteFile(item.getAbsolutePath()));
 | |||
|  |             }
 | |||
|  |             file.delete();
 | |||
|  |         }
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static boolean exist(String path) {
 | |||
|  |         File file = new File(path);
 | |||
|  |         return file.exists();
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static List<String> listFileNames(String path) {
 | |||
|  |         File file = new File(path);
 | |||
|  |         if (!file.exists()) {
 | |||
|  |             return null;
 | |||
|  |         } else {
 | |||
|  |             File[] files = file.listFiles();
 | |||
|  | 
 | |||
|  |             assert files != null;
 | |||
|  | 
 | |||
|  |             return Arrays.stream(files).map(File::getName).collect(Collectors.toList());
 | |||
|  |         }
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static String getSuffix(String fileName) {
 | |||
|  |         return fileName.substring(fileName.lastIndexOf(".") + 1);
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static String getPrefix(String fileName) {
 | |||
|  |         return fileName.substring(0, fileName.lastIndexOf("."));
 | |||
|  |     }
 | |||
|  | 
 | |||
|  |     public static byte[] readBytes(String path) {
 | |||
|  |         File file = new File(path);
 | |||
|  |         if (!file.exists() || !file.isFile()) {
 | |||
|  |             DEException.throwException("文件不存在");
 | |||
|  |         }
 | |||
|  | 
 | |||
|  |         byte[] bytes = null;
 | |||
|  | 
 | |||
|  |         try {
 | |||
|  |             FileInputStream fis = new FileInputStream(file);
 | |||
|  | 
 | |||
|  |             try {
 | |||
|  |                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 | |||
|  | 
 | |||
|  |                 try {
 | |||
|  |                     byte[] buffer = new byte[4096];
 | |||
|  | 
 | |||
|  |                     while (true) {
 | |||
|  |                         int bytesRead;
 | |||
|  |                         if ((bytesRead = fis.read(buffer)) == -1) {
 | |||
|  |                             bytes = bos.toByteArray();
 | |||
|  |                             break;
 | |||
|  |                         }
 | |||
|  | 
 | |||
|  |                         bos.write(buffer, 0, bytesRead);
 | |||
|  |                     }
 | |||
|  |                 } catch (Throwable var9) {
 | |||
|  |                     try {
 | |||
|  |                         bos.close();
 | |||
|  |                     } catch (Throwable var8) {
 | |||
|  |                         var9.addSuppressed(var8);
 | |||
|  |                     }
 | |||
|  | 
 | |||
|  |                     throw var9;
 | |||
|  |                 }
 | |||
|  | 
 | |||
|  |                 bos.close();
 | |||
|  |             } catch (Throwable var10) {
 | |||
|  |                 try {
 | |||
|  |                     fis.close();
 | |||
|  |                 } catch (Throwable var7) {
 | |||
|  |                     var10.addSuppressed(var7);
 | |||
|  |                 }
 | |||
|  | 
 | |||
|  |                 throw var10;
 | |||
|  |             }
 | |||
|  | 
 | |||
|  |             fis.close();
 | |||
|  |         } catch (Exception var11) {
 | |||
|  |             var11.printStackTrace();
 | |||
|  |         }
 | |||
|  | 
 | |||
|  |         return bytes;
 | |||
|  |     }
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     public static boolean deleteDirectoryRecursively(String directoryPath) {
 | |||
|  |         File directory = new File(directoryPath);
 | |||
|  |         if (!directory.exists()) {
 | |||
|  |             return true;
 | |||
|  |         }
 | |||
|  | 
 | |||
|  |         File[] files = directory.listFiles();
 | |||
|  |         if (files != null) {
 | |||
|  |             for (File file : files) {
 | |||
|  |                 if (file.isDirectory()) {
 | |||
|  |                     deleteDirectoryRecursively(file.getAbsolutePath());
 | |||
|  |                 } else {
 | |||
|  |                     boolean deletionSuccess = file.delete();
 | |||
|  |                 }
 | |||
|  |             }
 | |||
|  |         }
 | |||
|  |         return directory.delete();
 | |||
|  |     }
 | |||
|  | }
 |