JAVA导入txt文件并按行读取内容封装成实体以及导出下载

2023-11-05

业务背景:
前台页面支持用户上传txt类型的文件,用做一些服务的配置,我们需求将改文件解析,读取里面的内容,并封装成接口参数,再调第三方接口;

上代码:

   @PostMapping("/uploadHost")
    @RequiresRoles("admin")
    public Result<Boolean> uploadHost(@RequestParam("file") MultipartFile multipartFile) throws Exception {
        if (multipartFile.isEmpty()) {
            throw new FuxiException("文件不能为空");
        }
        //转成file类型
        File file = FileUtils.multipartFileToFile(multipartFile);
        assert file != null;
        InputStreamReader read = null;
        List<TxtEntity>entityList = null;
        try {
           //先读入再放入缓冲流里面按行读取
            read = new InputStreamReader(new FileInputStream(file), "GBK");
            entityList = new ArrayList<>();
            BufferedReader br = new BufferedReader(read);
            String lineTxt;

            while ((lineTxt = br.readLine()) != null) {
            //跳过注释和空行
                if (lineTxt.startsWith("#") || StringUtils.isEmpty(lineTxt)){
                    continue;
                }
                //我这个地方是按空格分割,可以根据自己的业务场景编写规则
                String[] strings = lineTxt.split(" ");
                //封装成实体
                TxtEntity txtEntity = new TxtEntity();
                txtEntity.setIp(strings[0]);
                txtEntity.setHostName(strings[1]);
                if (strings.length > 2){
                    txtEntity.setServer(strings[2]);
                }
                entityList.add(txtEntity);
            }
            if (entityList.isEmpty()){
                return Result.error(500,"文件不能为空");
            }
             //调第三方接口,这里可以写自己的代码逻辑
            Integer result = fuxiInterfaceRestService.hostsImport(entityList);
            if (result == 0) {
                fileManageService.updateFileInfo(BehaviorEnum.HOST);
                return Result.success();
            }
            return Result.error(500,"上传失败");
        } catch (IOException e) {
            log.info(String.format("host文件解析失败 : %s",e.getMessage()));
            throw new IOException("文件解析错误");
        }finally {
            if (read != null){
                read.close();
            }
        }

    }
   /**
     * MultipartFile 转 File
     *
     * @param file
     * @throws Exception
     */
    public static File multipartFileToFile(MultipartFile file) throws Exception {

        File toFile = null;
        if ("".equals(file) || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }

下载文件:
我直接贴个工具类,可以下载成xml、properties、text文件

package com.ddb.common.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

/**
 * @Author zqf
 * @Date 2022/7/29 10:11
 * @Description: 文件工具
 */
@Slf4j
public class FileUtils {

    /**
     * MultipartFile 转 File
     *
     * @param file
     * @throws Exception
     */
    public static File multipartFileToFile(MultipartFile file) throws Exception {

        File toFile = null;
        if ("".equals(file) || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }

    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 导出xml 需要HttpServletResponse response
     */
    public static void creatAndSendXML(HttpServletResponse response, String fileName, String xml){
        BufferedOutputStream output = null;
        try {
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-msdownload");
            response.addHeader("Content-Disposition","attachment;filename="+fileName);
            output = new BufferedOutputStream(response.getOutputStream());
            output.write(xml.getBytes());
            output.flush();   //不可少
            response.flushBuffer();//不可少
        }catch (Exception e){
            e.printStackTrace();
            log.error("导出文件文件出错:{}",e);
        }finally {
            try {
                assert output != null;
                output.close();
            }catch (Exception e){
                log.error("关闭流对象出错 e:{}",e);
                e.printStackTrace();
            }
        }
    }
    /**
     * 导出xml 需要HttpServletResponse response
     */
    public static void creatAndSendYml(HttpServletResponse response, String fileName, String yml){
        BufferedOutputStream output = null;
        try {
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-msdownload");
            response.addHeader("Content-Disposition","attachment;filename="+fileName);
            output = new BufferedOutputStream(response.getOutputStream());
            output.write(yml.getBytes());
            output.flush();   //不可少
            response.flushBuffer();//不可少
        }catch (Exception e){
            e.printStackTrace();
            log.error("导出文件文件出错:{}",e);
        }finally {
            try {
                assert output != null;
                output.close();
            }catch (Exception e){
                log.error("关闭流对象出错 e:{}",e);
                e.printStackTrace();
            }
        }
    }


    /**
     * 导出Properties 需要HttpServletResponse response
     */
    public static void exportProperties(HttpServletResponse response, String fileName, String yml){
        BufferedOutputStream output = null;
        try {
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-msdownload");
            response.addHeader("Content-Disposition","attachment;filename="+fileName);
            output = new BufferedOutputStream(response.getOutputStream());
            output.write(yml.getBytes());
            output.flush();   //不可少
            response.flushBuffer();//不可少
        }catch (Exception e){
            e.printStackTrace();
            log.error("导出文件文件出错:{}",e);
        }finally {
            try {
                assert output != null;
                output.close();
            }catch (Exception e){
                log.error("关闭流对象出错 e:{}",e);
                e.printStackTrace();
            }
        }
    }
    /**
     * 导出普通文本
     * @param response
     * @param text
     */
    public static void exportTxt(HttpServletResponse response,String text){
        response.setCharacterEncoding("utf-8");
        //设置响应的内容类型
        response.setContentType("text/plain");
        //设置文件的名称和格式  设置名称格式,没有这个中文名称无法显示
        response.addHeader("Content-Disposition","attachment;filename="
                + genAttachmentFileName( "host", "JSON_FOR_UCC_")
                + ".txt");
        BufferedOutputStream buff = null;
        ServletOutputStream outStr = null;
        try {
            outStr = response.getOutputStream();
            buff = new BufferedOutputStream(outStr);
            buff.write(text.getBytes(StandardCharsets.UTF_8));
            buff.flush();
            buff.close();
        } catch (Exception e) {
            log.error("导出文件文件出错:{}",e);
        } finally {try {
            assert buff != null;
            buff.close();
            outStr.close();
        } catch (Exception e) {
            log.error("关闭流对象出错 e:{}",e);
        }
        }
    }


    public static String genAttachmentFileName(String cnName, String defaultName) {
        try {
            cnName = new String(cnName.getBytes("gb2312"), "ISO8859-1");
        } catch (Exception e) {
            cnName = defaultName;
        }
        return cnName;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA导入txt文件并按行读取内容封装成实体以及导出下载 的相关文章

随机推荐

  • R329-opencv阈值分割算法——自适应阈值

    R329 opencv阈值分割算法 自适应阈值 在不均匀照明或者灰度值分布不均的情况下 如果使用全局阈值分割 那么得到的分割效果往往会很不理想 这个时候就要你用到自适应阈值算法了 OpenCV提供了自适应的二值化函数 通过该函数可以对图像的
  • 如何使用网页版微信文件传输助手(图解教程)

    微信文件传输助手网页版是一款非常方便的工具 可以帮助我们在电脑和手机之间传输文件 而且不需要电脑登录微信即可传输文件 下面是具体的操作步骤 步骤一 打开多御浏览器 点击微信文件传输助手 然后使用微信扫描页面上的二维码 即可进入微信传输助手界
  • uniapp开发微信小程序初次加载弹窗显示隐私政策

    效果图 废话不多说 直接上代码
  • 计算机基础第三版知识点总结,计算机基础知识点归纳总结

    计算机等级考试作为当代大学生必考科目之一 它的基础知识点有哪些呢 以下是由出国留学网编辑为大家整理的 计算机基础知识点归纳总结 仅供参考 欢迎大家阅读 计算机基础知识点归纳总结 计算机的发展 类型及其应用领域 1 计算机 computer
  • 智能BI,如今走到了哪一步?

    我们现在需要的不仅是石油 更是如何使用好石油 作者 三七 编辑 皮爷 出品 产业家 错进 错出 这是美国税务局在1963年对数据质量提出的解释 以此来试图表达数据对于计算机处理结果质量的重要性 这一观点的源头来自 计算机之父 查尔斯 巴贝奇
  • 常见erp系统

    ERP系统是提供决策手段的管理平台 很多的企业都有使用 那么常见的ERP系统都有哪些呢 像国内外最常见的ERP系统有鼎捷ERP系列 SAP Oracle 博科 泛普软件 Infor QAD QAD Adaptive 等 鼎捷ERP系统 鼎捷
  • 三种常见DDOS攻击应对策略

    DDos防御需要根据不同的攻击类型和不同的攻击方式指定对应的策略才能达到最有效的防御 常见的DDos包括 Flood CC和反射等 1 flood攻击 Flood类的攻击最常见并简单有效 黑客通过控制大量的肉鸡同时向服务器发起请求 进而达到
  • 一篇文章搞定克拉美罗界(CRB)

    起因 二郎最近在研究LBL 长基线 定位 大部分论文都提到了文中算法获得的方差接近CRB 所以自己的算法性能较好 于是二郎就想知道克拉美罗界是什么意思 以及能应用的场景 经过 1 查文档 克拉美罗界 为无偏估计量的方差确定一个下界 衡量无偏
  • 详细安装配置django

    安装配置使用Django 1 下载安装 django pip install django 2 创建设置项目 先进入要放置项目的文件夹下 2 1 创建项目 django admin startproject Api project 2 2
  • 万兆以太网选择6类线还是6A类线?

    在综合布线中 有些时候必不可免的需要用到万兆铜缆以太网 那么这个时候就会产生一个问题 就是线缆的选型 6类线和6A类线都可以支持到万兆以太网 那么究竟是选择成本较为低廉的6类线还是选择规格更高一些的6A类线缆 6类线与6A类线的区别 起初
  • Cordic算法

    Cordic算法可以利用简单的移位和加减来计算复杂的三角函数 双曲函数 对数 指数等 Cordic算法核心思想有两点 通过已知的角度来逼近输入的角度 用移位来代替tan 已知角度的cos 经过多次积累相乘趋于常数 具体原理如下 根据坐标旋转
  • 怎么委婉的拒绝别人

    其实拒绝别人最难的那个是自己 有心理负担 导致很多人不能说 不 多少次后悔答应别人了 但是也不能没有技巧的拒绝别人 如果没有思考过 那么也会让自己后悔自己做的不合适 方法不对 怎么去拒绝别人呢 需要掌握好技巧和心理分析然后坦然的拒绝别人是这
  • 关于Mybatis一对多查询以及返回一条记录的经验总结

    前人经验 关于一对多返回一条的问题 原因是在于多张表有列名相同的字段 如果在数据库中使用连接操作 如 INNER JOIN LEFT JOIN RIGHT JOIN 等 进行连接时 列名有相同的字段 则在连接结果集中 这些列名相同的字段会被
  • c:forEach status.index 行索引的使用

    使用seam做了个项目 展示一个自定义列表输出 分别定义表格标题List headerList和数据List
  • 浅谈云计算的三种服务模式:IaaS,PaaS和SaaS

    2008年 云计算的概念由Google率先提出 短时间内其核心理念在全球范围内迅速传播并发展 2010年在国内形成趋势 各大IT互联网商业巨头将目光聚焦在云计算 至目前 云计算在中国已经慢慢开始成熟起来 云计算指的是通过网络 云 将巨大的数
  • python从入门到精通——完整教程【转载】

    文章目录 一 pycharm下载安装 二 python下载安装 三 pycharm上配置python 四 配置镜像源让你下载嗖嗖的快 4 1 pycharm内部配置 4 2 手动添加镜像源 4 3 永久配置镜像源 五 插件安装 比如汉化 5
  • ios逆向(二)frida-ios-dump一键砸壳详细版

    写在前面 本教程为本人实际操作记录 在此感谢庆哥官方 一条命令完成砸壳 github frida ios dump ios端配置 打开cydia 添加源 https build frida re 打开刚刚添加的源 安装 frida 安装完成
  • 注册表关闭windows安全中心_关闭win10自动更新的三个小妙招,再也不用被自动下载更新打扰了...

    对于Windows 10操作系统 微软默认设置为自动下载并安装Windows 以确保系统正常运行并保持其安全性 但是在某些情况下 需要关闭Windows 10更新或在Windows 10上禁用自动更新安装 这该如何办呢 本文目录 关于Win
  • Linux系统中文件查找find函数用法

    find name april 在当前目录下查找以april开始的文件 find name april fprint file 在当前目录下查找以april开始的文件 并把结果输出到file中 find name ap o name may
  • JAVA导入txt文件并按行读取内容封装成实体以及导出下载

    业务背景 前台页面支持用户上传txt类型的文件 用做一些服务的配置 我们需求将改文件解析 读取里面的内容 并封装成接口参数 再调第三方接口 上代码 PostMapping uploadHost RequiresRoles admin pub