Java 文件上传,下载,复制,删除,Zip文件解压缩,文件内容修改,JSON 文件中字段值的修改,递归删除文件夹及其子文件等

本文主要是介绍Java 文件上传,下载,复制,删除,Zip文件解压缩,文件内容修改,JSON 文件中字段值的修改,递归删除文件夹及其子文件等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java 文件上传,下载,复制,删除,Zip文件解压缩,文件内容修改,JSON 文件中字段值的修改,递归删除文件夹及其子文件等

  • Controller
  • FileUtil

Controller

  • 文件批量上传
  • 批量删除文件
  • 文件下载
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;@Slf4j
@RestController
@AllArgsConstructor
@Api(tags = "文件相关操作接口")
@RequestMapping("/file")
public class FileController
{/*** @param files 文件列表* @param tempFilePath 临时文件路径*/@ApiOperation(value = "文件批量上传")@PostMapping("/uploadFiles")public Result<?> uploadFiles(@RequestParam(value = "file") MultipartFile[] files, String tempFilePath){List<Map<String, Object>> list;try{list = FileUtil.uploadFiles(files, tempFilePath);} catch (Exception e){return Result.fail(e.getMessage());}return Result.success(list);}/*** @param fileNames 文件名称列表* @param targetPath 目标路径*/@PostMapping("/deleteFiles")@ApiOperation("批量删除文件")public void deleteFiles(@RequestParam(value = "files") String[] fileNames, String targetPath){FileUtil.deleteFiles(fileNames, targetPath);}/*** 文件下载,1.如果有文件名称,则将文件名称拼接到路径后进行下载;2.否则直接根据路径下载;* 第一种情况:filePath=”D:/file“;fileName=“test.txt”;* 第二种情况:filePath=”D:/file/test.txt“;fileName=“”;* @param filePath 文件路径(必填)* @param fileName 文件名称(可选)* @return ResponseEntity*/@ApiOperation("文件下载")@GetMapping("/download")public ResponseEntity<Resource> download(@RequestParam String filePath, String fileName){try{return FileUtil.download(filePath, fileName);} catch (Exception e){log.error("文件下载失败", e);throw new RuntimeException(e);}}}

FileUtil

  • 文件批量上传
  • 批量删除文件
  • 文件下载
  • 压缩包校验
  • Zip文件解压缩
  • 创建文件夹
  • 递归地删除文件夹及其所有内容
  • 复制文件夹中的所有内容
  • 复制文件,将从源目录中的文件复制到目标目录中
  • 修改 JSON 文件中指定字段的值
  • 修改文件内容
@Slf4j
public class FileUtil
{/*** 上传文件* @param files 文件列表* @param targetPath 目标路径* @return*/public static List<Map<String, Object>> uploadFiles(MultipartFile[] files, String targetPath){int size = 0;for (MultipartFile file : files){size = (int) file.getSize() + size;}List<Map<String, Object>> fileInfoList = new ArrayList<>();for (int i = 0; i < files.length; i++){Map<String, Object> map = new HashMap<>();String fileName = files[i].getOriginalFilename();//获取文件后缀//            String afterName = StringUtils.substringAfterLast(fileName, ".");//获取文件前缀//            String prefName = StringUtils.substringBeforeLast(fileName, ".");//            String fileServiceName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + i + "_" + prefName//                    + "." + afterName;String fileServiceName = UUID.randomUUID().toString().replace("-", "") + "_" + fileName;File filePath = new File(targetPath, fileServiceName);map.put("fileServiceName", fileServiceName);map.put("fileName", fileName);map.put("filePath", filePath);// 判断文件父目录是否存在if (!filePath.getParentFile().exists()){filePath.getParentFile().mkdirs();}try{files[i].transferTo(filePath);} catch (IOException e){log.error("文件上传失败", e);throw new CustomException("文件上传失败");}fileInfoList.add(map);}return fileInfoList;}/*** 批量删除文件** @param fileNames 文件名称数组*/public static void deleteFiles(String[] fileNames, String targetPath){for (String fileName : fileNames){String filePath = targetPath + fileName;File file = new File(filePath);if (file.exists()){try{Files.delete(file.toPath());} catch (IOException e){e.printStackTrace();log.warn("文件删除失败", e);}} else{log.warn("文件: {} 删除失败,该文件不存在", fileName);}}}/*** 文件下载* @param filePath 文件路径(必填)* @param fileName 文件名称(可选)* @return ResponseEntity*/public static ResponseEntity<Resource> download(String filePath, String fileName)throws MalformedURLException, UnsupportedEncodingException{// 加载文件资源Resource resource = loadFileAsResource(filePath, fileName);// 避免中文乱码String encodedFileName = URLEncoder.encode(Objects.requireNonNull(resource.getFilename()), "UTF-8").replaceAll("\\+", "%20");// 确定文件的内容类型return ResponseEntity.ok().contentType(MediaType.parseMediaType(ContentType.OCTET_STREAM.getValue())).header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + encodedFileName).body(resource);}/*** 加载文件资源* @param filePath 文件路径(必填)* @param fileName 文件名称(选填)* @return Resource* @throws MalformedURLException URL格式异常*/private static Resource loadFileAsResource(String filePath, String fileName) throws MalformedURLException{Path path;if (StringUtils.isEmpty(fileName)){path = Paths.get(filePath);} else{path = Paths.get(filePath + File.separator + fileName);}Resource resource = new UrlResource(path.toUri());if (resource.exists() || resource.isReadable()){return resource;} else{throw new RuntimeException("找不到文件或无法读取文件");}}/*** 压缩包校验* @param zipFilePath 压缩包文件路径* @param suffix 文件后缀* @throws Exception*/public static void zipVerify(String zipFilePath, String suffix) throws Exception{// 打开压缩文件try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(Paths.get(zipFilePath)))){ZipEntry entry = zipInputStream.getNextEntry();boolean allFilesAreSameSuffix = true;// 遍历压缩文件中的条目while (entry != null){String entryName = entry.getName();if (!entryName.toLowerCase().endsWith(suffix)){allFilesAreSameSuffix = false;break;}zipInputStream.closeEntry();entry = zipInputStream.getNextEntry();}// 如果存在非.pak文件则校验失败if (!allFilesAreSameSuffix){throw new RuntimeException("压缩包中存在非" + suffix + "文件,校验失败");}}}/*** Zip文件解压缩* @param zipFilePath 压缩包文件路径* @param destDirectory 目标目录* @throws IOException*/public static List<String> unzip(String zipFilePath, String destDirectory) throws Exception{// 文件名列表List<String> fileNameList = new ArrayList<>();// 创建目标文件夹File destDir = new File(destDirectory);if (!destDir.exists()){destDir.mkdirs();}// 读取并解压文件try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(Paths.get(zipFilePath)))){ZipEntry entry = zipInputStream.getNextEntry();byte[] buffer = new byte[1024];// 解压文件while (entry != null){String entryName = entry.getName();File newFile = new File(destDirectory + File.separator + entryName);try (FileOutputStream fos = new FileOutputStream(newFile)){int len;while ((len = zipInputStream.read(buffer)) > 0){fos.write(buffer, 0, len);}}zipInputStream.closeEntry();fileNameList.add(entryName);entry = zipInputStream.getNextEntry();}}log.info("解压缩并校验完成");return fileNameList;}/*** 创建文件夹* @param folderPath*/public static void createFolder(String folderPath){File folder = new File(folderPath);if (!folder.exists()){if (!folder.mkdirs()){throw new RuntimeException("文件夹创建失败: " + folderPath);}}}/*** 递归地删除文件夹及其所有内容* @param folderPath 文件夹路径*/public static void deleteFolder(String folderPath){File folder = new File(folderPath);if (folder.exists()){File[] files = folder.listFiles();if (files != null){for (File file : files){if (file.isDirectory()){deleteFolder(file.getAbsolutePath());} else{file.delete();}}}folder.delete();log.info("文件夹{}删除成功!", folderPath);}}/*** 复制文件夹中的所有内容* @param sourceFolderPath 源文件夹路径       例如:D:/XXX/AAA/BBB/CCC* @param targetFolderPath 目标文件夹路径      例如:D:/YYY/BBB/CCC/DDD* @param newFolderName 新文件夹名称           例如:EEE* @return 目标文件路径                        例如:D:/YYY/BBB/CCC/DDD/EEE*/public static String copyFolderOfAll(String sourceFolderPath, String targetFolderPath, String newFolderName){String destinationFolderPath = targetFolderPath + File.separator + newFolderName;Path sourcePath = Paths.get(sourceFolderPath);Path destinationPath = Paths.get(destinationFolderPath);try{// 遍历源文件夹中的所有文件和子文件夹Files.walk(sourcePath).forEach(source -> {try{// 构建目标文件夹中的对应路径Path destination = destinationPath.resolve(sourcePath.relativize(source));if (Files.isDirectory(source)){if (!Files.exists(destination)){Files.createDirectory(destination);}} else{Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);}} catch (IOException e){throw new RuntimeException("复制文件夹失败: " + e.getMessage());}});} catch (Exception e){log.error("文件夹复制失败: {}", e);FileUtil.deleteFolder(destinationFolderPath);throw new RuntimeException("文件夹复制失败");}return destinationFolderPath;}/*** 复制文件,将从源目录中的文件复制到目标目录中* @param sourceFilePath 源文件路径* @param destinationDirectory 目标目录* @param newFileName 新文件名称*/public static void copeFile(String sourceFilePath, String destinationDirectory, String newFileName){Path sourceFile = Paths.get(sourceFilePath);Path destinationFile = Paths.get(destinationDirectory, newFileName);try{Files.copy(sourceFile, destinationFile);log.info("File copied successfully from " + sourceFile + " to " + destinationFile);} catch (IOException e){log.error("Error copying file: " + e.getMessage());}}/*** 修改JSON文件中指定字段的值* @param filePath 文件路径* @param fieldName 字段名* @param newValue 新值*/public static void modifyJsonField(String filePath, String fieldName, Object newValue){try{ObjectMapper objectMapper = new ObjectMapper();File file = new File(filePath);JsonNode jsonNode = objectMapper.readTree(file);if (jsonNode.isObject()){ObjectNode objectNode = (ObjectNode) jsonNode;objectNode.putPOJO(fieldName, newValue);objectMapper.writeValue(file, objectNode);log.info("Field '" + fieldName + "' in the JSON file has been modified to: " + newValue);} else{log.info("Invalid JSON format in the file.");}} catch (IOException e){throw new RuntimeException(e);}}/*** 修改文件内容* @param filePath 文件路径* @param searchString 查找字符串* @param replacement 替换值*/public static void modifyFileContent(String filePath, String searchString, String replacement){try{File file = new File(filePath);BufferedReader reader = new BufferedReader(new FileReader(file));String line;StringBuilder content = new StringBuilder();while ((line = reader.readLine()) != null){if (line.contains(searchString)){line = line.replace(searchString, replacement);}content.append(line).append("\n");}reader.close();BufferedWriter writer = new BufferedWriter(new FileWriter(file));writer.write(content.toString());writer.close();log.info("文件内容[" + searchString + "]已被修改为[" + replacement + "]");} catch (IOException e){throw new RuntimeException(e);}}
}

这篇关于Java 文件上传,下载,复制,删除,Zip文件解压缩,文件内容修改,JSON 文件中字段值的修改,递归删除文件夹及其子文件等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920126

相关文章

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni