Java的File文件操作案例汇总

news2024/10/6 0:28:16

Java的File文件操作案例汇总

  • 案例汇总
    • 【1】MultipartFile与File的互转
      • (1)前言
      • (2)MultipartFile转File
      • (3)手动删除
      • (4)File转MultipartFile
    • 【2】前端上传文件,后端解析出文件的名称和内容,然后存储到数据库
    • 【3】后端从数据库查询内容,然后把内容放进文件中,供前端下载
    • 【4】生成文件到指定文件夹,然后将文件夹压缩成zip格式,并下载

案例汇总

【1】MultipartFile与File的互转

(1)前言

需求是上传Excel文件并读取Excel文件中的内容,根据获取的数据执行完某些业务操作后再将一些数据写回到excel中。前台使用FormData表单的方式请求后台,后台接收类型是MultipartFile,放置文件过大时会造成内存溢出需要转换为File类型

(2)MultipartFile转File

其实转换的本质都是要创建一个file的临时文件,然后通过各种实现方式将MultipartFile中的内容写入到file中

(1)FileUtils.copyInputStreamToFile转换

package com.cxstar.file.util;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @author zhouquan
 * @description 测试MultipartFile与File互转
 * @date 2023-03-12 17:31
 **/
public class FileTestUtils {


    /**
     * MultipartFile转File
     * <p>
     * 项目根路径创建临时文件,转换得到File,再删除临时文件
     *
     * @param multipartFile
     * @return
     */
    public static File multiPartFileToFile(MultipartFile multipartFile) throws IOException {

        //获取文件名
        String originalFilename = multipartFile.getOriginalFilename();

        //获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
        String tempDir = System.getProperty("user.dir");

        //根目录下生成临时文件
        File file = new File(tempDir+File.separator+originalFilename);

        FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);

        return file;
    }

}

此种方式的弊端就是需要在调用此方法后需要再手动删除,也就是要在业务代码中再掺杂删除的逻辑。

(2)multipartFile.transferTo(tempFile);

/**
     * MultipartFile转File
     * <p>
     * 项目根路径创建缓冲区来实现这个转换
     *
     * @param multipartFile
     * @return
     */
    public static File multiPartFileToFile2(MultipartFile multipartFile) throws IOException {

        //获取文件名
        String originalFilename = multipartFile.getOriginalFilename();

        //获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径
        String tempDir = System.getProperty("user.dir");

        //获取文件名
        String filename = StringUtils.substringBeforeLast(originalFilename, ".");
        //获取文件后缀
        String fileExt = StringUtils.substringAfterLast(originalFilename, ".");

        //在项目根路径生成临时文件
        File tempFile = File.createTempFile(filename, "." + fileExt, new File(tempDir));

        multipartFile.transferTo(tempFile);

        //在jvm退出时执行删除此路径下的文件
        tempFile.deleteOnExit();

        return tempFile;
    }

注意:
1.防止生成的临时文件,createTempFile()方法会在文件名后添加随机码
2.生成的文件不会立马删除,而是在jvm退出时执行删除此路径下的文件

(3)(推荐)FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());

package com.cxstar.file.util;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @author zhouquan
 * @description 测试MultipartFile与File互转
 * @date 2023-03-12 17:31
 **/
public class FileTestUtils {
    /**
     * MultipartFile 转 File
     *
     * @param multipartFile
     * @throws Exception
     */
    public static File multiPartFileToFile3(MultipartFile multipartFile) {
        File file = null;
        if (multipartFile.isEmpty()) {
            return null;
        }

        try {
            //本质上还是在项目根路径创建文件
            file = new File(multipartFile.getOriginalFilename());

            //将MultipartFile的byte[]写入到file中
            FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
}


此种方式相较于第二种方式,文件名不会发生改变,当然还是要手动删除

(3)手动删除

// 操作完上的文件 需要删除在根目录下生成的文件
File f = new File(sqlFile.toURI());
if (f.delete()){
    System.out.println("删除成功");
}else {
    System.out.println("删除失败");
}

(4)File转MultipartFile

(1)File转MultipartFile
MultipartFile文件上传时,其实springmvc已经转为StandardMultipartFile子类型

org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile

在这里插入图片描述
MultipartFile是一个接口,因此转成MultipartFile格式需要转成实现MultipartFile接口的实现类即可

在这里插入图片描述

package com.cxstar.file.util;

import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;

/**
 * @author zhouquan
 * @description 测试MultipartFile与File互转
 * @date 2023-03-12 17:31
 **/
public class FileTestUtils {
    public static MultipartFile getMultipartFile(File file) throws Exception {
        MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));
        return multipartFile;
}

【2】前端上传文件,后端解析出文件的名称和内容,然后存储到数据库

@PostMapping(value = "/uploadSql")
@Operation(summary = "全部查询接口表SQL信息", description = "全部查询接口表SQL信息")
public ApiResponse<InterfaceSql> uploadSql(@RequestParam("file") MultipartFile  file) {
    return interfaceSqlAppService.uploadSql(file);
}
public DomainResponse<InterfaceSql> uploadSql(MultipartFile file) {
    if (file.isEmpty()) {
        throw new YTRuntimeException("上传失败,请选择文件");
    }
    File sqlFile = null;
    try {
        //本质上还是在项目根路径创建文件
        sqlFile = new File(file.getOriginalFilename());
        //将MultipartFile的byte[]写入到file中
        FileUtils.writeByteArrayToFile(sqlFile, file.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }

    String fileName = file.getOriginalFilename();
    StringBuilder fileContent = new StringBuilder();
    try (BufferedReader br = new BufferedReader(new FileReader(sqlFile))) {
        String line;
        while ((line = br.readLine()) != null) {
            fileContent.append(line).append("\n");
        }
    } catch (IOException e) {
        throw new YTRuntimeException("读取文件失败");
    }
    String sqlContent = fileContent.toString();

    InterfaceSql interfaceSql = new InterfaceSql();
    interfaceSql.setFileName(fileName);
    interfaceSql.setFileContent(sqlContent);

    interfaceSqlRepo.create(interfaceSql);

    // 操作完上的文件 需要删除在根目录下生成的文件
    File f = new File(sqlFile.toURI());
    if (f.delete()){
        System.out.println("删除成功");
    }else {
        System.out.println("删除失败");
    }

    return DomainResponse.ok(interfaceSql);
}

【3】后端从数据库查询内容,然后把内容放进文件中,供前端下载

@GetMapping(value = "/downloadSql/{INTERFACE_SQL_id}")
@Operation(summary = "全部查询接口表SQL信息", description = "全部查询接口表SQL信息")
public ApiResponse<Void> downloadSql(@PathVariable("INTERFACE_SQL_id") String  id, HttpServletResponse response) {
    return interfaceSqlAppService.downloadSql(id,response);
}
public DomainResponse<Void> downloadSql(String id,HttpServletResponse response)  {
    InterfaceSql interfaceSql = interfaceSqlRepo.queryById(id);
    String fileName = interfaceSql.getFileName();
    String fileContent = interfaceSql.getFileContent();
    try {
        FileUDUtil.downloadDbData(response,fileName,fileContent);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return DomainResponse.ok();
}
public static void downloadDbData(HttpServletResponse response, String fileName, String fileContent) throws IOException {
    if (ObjectUtil.isEmpty(fileName)) {
        throw new YTRuntimeException("文件名称不允许为空");
    }
    try {
        // 创建File对象
        File file = new File(fileName);
        // 创建FileOutputStream和BufferedOutputStream
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        // 将字符串内容写入文件
        bos.write(fileContent.getBytes());

        // 关闭流
        bos.close();
        fos.close();

        // 设置响应头
        response.setHeader("Content-Disposition", "attachment;filename="+fileName);

        // 获取OutputStream对象
        OutputStream os = response.getOutputStream();

        // 创建FileInputStream和byte数组
        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];

        // 将文件内容写入到客户端
        int len;
        while ((len = fis.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }

        // 关闭流
        fis.close();
        os.close();
    } catch (FileNotFoundException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

【4】生成文件到指定文件夹,然后将文件夹压缩成zip格式,并下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拓扑排序求最长路

P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求我们求出第1号到第n号节点之间最长的距离。 我们想到使用拓扑排序来求最长路。 正常来讲&#xff0c;我们应该把1号节点入队列&#xff0c;再出队列&#xff0c;把一号节点能到达的所有的点的入度减一&a…

网线接法aaa

![(https://img-blog.csdnimg.cn/d2901403dbd44feaa8f7be669ddcf2fc.png) 加粗样式 在这里插入图片描述

ZTree自定义不可展开节点的折叠图标

目录 1. 场景2. 实现过程3. ZTree 关键配置代码4. 小结 &#x1f4ac; 1. 场景 需求是自定义去控制某个节点&#xff0c;让它不可以展开&#xff0c;但因为它底下有子节点&#xff0c;所以默认的折叠图标还是&#xff0b;号。 也就是要实现让不可展开的节点前的折叠图标显示-号…

浅谈IT运维-服务请求管理与变更管理的关系与区别

服务请求 用户或用户授权代表发起的服务动作的请求&#xff0c;该服务动作已约定为服务交付的正常部分。服务请求是用户问询的重要类型,也是用户体验的重要组成部分。通常,服务请求包括以下内容: 发起服务动作请求(由服务提供者或与用户一起执行)信息请求资源或服务访问请求反…

Python还有什么赋值?Python赋值语句的多种形式

Python是一种强大且灵活的编程语言&#xff0c;其赋值语句的多样性是其特色之一。除了常见的变量赋值&#xff0c;Python还支持许多其他赋值方式&#xff0c;包括多重赋值、增量赋值以及解包赋值等。在本文中&#xff0c;我们将深入探讨Python中赋值语句的多种形式&#xff0c;…

日志管理工具Zap笔记

文章目录 Uber-go Zap日志库为什么选择 Zap配置 Zap Logger1. Logger2. SugaredLogger 定制logger1. 将日志写入文件而不是终端2. 将JSON Encoder更改为普通的Log Encoder3. 更改时间编码并添加调用者详细信息4. AddCallerSkip5. 将err日志单独输出到文件 使用Lumberjack进行日…

ARM按键中断实验

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 src/do_irq.c #include "key_it.h" ex…

基于Java+SpringBoot+Vue精品水果线上销售网站的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

对验证码的识别爆破

声明&#xff1a;该系列文章首发于公众号&#xff1a;Y1X1n安全&#xff0c;转载请注明出处&#xff01;本公众号所分享内容仅用于每一个爱好者之间的技术讨论及教育目的&#xff0c;所有渗透及工具的使用都需获取授权&#xff0c;禁止用于违法途径&#xff0c;否则需自行承担&…

【Python爬虫原理与基本请求库urllib详解】

Python爬虫原理与基本请求库urllib详解 这篇文章主要介绍了Python爬虫原理与基本请求库urllib详解,爬虫就是通过模拟浏览器&#xff0c;按照一定的规则&#xff0c;自动、大批量的获取网络资源&#xff0c;包括文本、图片、链接、音频、视频等等,需要的朋友可以参考下 文章目录…

java并发之AQS详解(待更)

一、为什么要用AQS同步框架&#xff1f; 开发者如果不了解JMM和多线程编程&#xff0c;就会写出很多线程不安全的程序&#xff0c;即使是经验丰富的程序员&#xff0c;并发编程也难免会出错。 而对于java程序员来说&#xff0c;并发编程就变得容易得多了&#xff0c;因为并发编…

《YOLOv7高阶自研》专栏介绍 CSDN独家改进创新实战 专栏目录

YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLOv7自研创新结合,轻松搞定科研 🍉🍉🍉持续更新中,定期更新不同数据集涨点情况 目录 全网首发&独家改进

C++DAY44

#include <iostream>using namespace std;class Animal//封装 动物 基类 { private:string name; public:Animal() {}Animal(string n):name(n){}virtual void perform() //虚函数{cout << "欢迎来到动物园" << endl;} };class Lion:public Animal…

LeetCode 1517. 查找拥有有效邮箱的用户

题目链接&#xff1a;1517. 查找拥有有效邮箱的用户 题目描述 表: Users Column NameTypeuser_idintnamevarcharmailvarchar user_id 是该表的主键&#xff08;具有唯一值的列&#xff09;。 该表包含了网站已注册用户的信息。有一些电子邮件是无效的。 编写一个解决方案&am…

LabVIEW将视觉生成器AI用作OPC服务器

LabVIEW将视觉生成器AI用作OPC服务器 介绍如何将视觉生成器AI配置为OPC服务器&#xff0c;并使用共享变量共享视觉生成器AI生成的结果。OPC是一系列标准规范&#xff0c;定义了来自不同制造商的控制设备之间的实时数据通信。OPC数据访问通信是基于客户端服务器的通信。 共享系…

适合自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1a; 1&#xff09;线下CTF比赛培训中存在严重的 “最后一公里”问题 &#…

nodejs+vue+elementui养老院老年人服务系统er809

“养老智慧服务平台”是运用nodejs语言和vue框架&#xff0c;以MySQL数据库为基础而发出来的。为保证我国经济的持续性发展&#xff0c;必须要让互联网信息时代在我国日益壮大&#xff0c;蓬勃发展。伴随着信息社会的飞速发展&#xff0c;养老智慧服务平台所面临的问题也一个接…

Text-to-SQL小白入门(八)RLAIF论文:AI代替人类反馈的强化学习

学习RLAIF论文前&#xff0c;可以先学习一下基于人类反馈的强化学习RLHF&#xff0c;相关的微调方法&#xff08;比如强化学习系列RLHF、RRHF、RLTF、RRTF&#xff09;的论文、数据集、代码等汇总都可以参考GitHub项目&#xff1a;GitHub - eosphoros-ai/Awesome-Text2SQL: Cur…

【PX4】解决Resource not found: px4问题【踩坑实录】

【PX4】解决Resource not found: px4问题【踩坑实录】 文章目录 【PX4】解决Resource not found: px4问题【踩坑实录】1. 问题描述2. 错误排查 1. 问题描述 笔者在配置好px4的所有环境后&#xff0c;使用自己写的launch文件时&#xff0c;出现了报错 sjhsjhR9000X:~$ roslaunc…

【面试算法——动态规划 21】正则表达式匹配(hard) 交错字符串

10. 正则表达式匹配 链接: 10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xf…