Java 实现TXT文件导入功能

引言

在现代Web应用中,文件上传和处理是一个常见的需求。本文将介绍如何实现一个简单的TXT文件导入功能,并解析其内容以供进一步处理。我们将使用Java后端技术栈来完成这个任务。

背景

假设我们有一个业务场景,需要从TXT文件中导入用户的免费天数信息。这些信息可能包含一些不需要的数据(如USER:、PGM:等),我们需要过滤掉这些数据并解析出有效的信息。

实现步骤

  1. 校验文件类型:首先检查上传的文件是否为TXT格式。
  2. 读取文件内容:逐行读取文件内容,并过滤掉不需要的行。
  3. 解析数据:根据业务规则解析有效数据。
  4. 返回结果:将解析后的数据返回给前端。

代码实现

java 复制代码
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class DepositController {

    @PostMapping("/feeDaysImport")
    public AjaxResult feeDaysImport(@RequestParam("file") MultipartFile file) throws Exception {
        List<DepositInfo> depositInfoList = new ArrayList<>();

        // 校验文件后缀名是否是 txt
        if (file.getOriginalFilename().toLowerCase().endsWith(".txt")) {
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
                StringBuilder lineAllContentBuilder = new StringBuilder();
                StringBuilder lineContentBuilder = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    if (line.contains("USER:") || line.contains("PGM:") || line.contains("CARRIER :")) {
                        continue; // 过滤掉不需要的行
                    }
                    if ("".equals(line) || line.trim().length() == 0) {
                        if (lineContentBuilder.length() > 0) {
                            lineAllContentBuilder.append(lineContentBuilder).append("FINISH\n");
                            lineContentBuilder.setLength(0); // 清空StringBuilder
                        }
                        continue;
                    } else {
                        lineContentBuilder.append(line).append("\n"); // 积累有效行内容
                    }
                }

                String lineAllContent = lineAllContentBuilder.toString();
                System.out.println("文本全部内容:\n" + lineAllContent);

                // 依照需求解析每行数据
                // 假设这里有一些解析逻辑...
                // parseData(lineAllContent, depositInfoList);

                return AjaxResult.success("操作成功", depositInfoList);
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("操作失败:" + e.getMessage());
                return AjaxResult.error("操作失败");
            }
        } else {
            logger.error("上传模板格式错误,请上传txt格式文件");
            return AjaxResult.error("上传模板格式错误,请上传txt格式文件");
        }
    }

    // 示例方法,用于模拟数据解析过程
    private void parseData(String content, List<DepositInfo> depositInfoList) {
        // 解析逻辑...
    }
}

进入代码分屏

代码解释

  1. 文件类型校验
less 复制代码
if (file.getOriginalFilename().toLowerCase().endsWith(".txt"))

我们通过检查文件名的后缀来确定文件类型是否为TXT。

  1. 文件读取与内容过滤
arduino 复制代码
try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
    StringBuilder lineAllContentBuilder = new StringBuilder();
    StringBuilder lineContentBuilder = new StringBuilder();
    String line;

    while ((line = reader.readLine()) != null) {
        if (line.contains("USER:") || line.contains("PGM:") || line.contains("CARRIER :")) {
            continue; // 过滤掉不需要的行
        }
        if ("".equals(line) || line.trim().length() == 0) {
            if (lineContentBuilder.length() > 0) {
                lineAllContentBuilder.append(lineContentBuilder).append("FINISH\n");
                lineContentBuilder.setLength(0); // 清空StringBuilder
            }
            continue;
        } else {
            lineContentBuilder.append(line).append("\n"); // 积累有效行内容
        }
    }

    String lineAllContent = lineAllContentBuilder.toString();
    System.out.println("文本全部内容:\n" + lineAllContent);
}

使用​​BufferedReader​​逐行读取文件内容,并过滤掉不需要的行。当遇到空白行时,将积累的有效行内容添加到最终的结果字符串中。

  1. 数据解析
arduino 复制代码
// 假设这里有一些解析逻辑...
// parseData(lineAllContent, depositInfoList);

在实际项目中,你需要在这里添加具体的解析逻辑,将解析后的数据存储到​​depositInfoList​​中。

  1. 异常处理
vbnet 复制代码
catch (Exception e) {
    e.printStackTrace();
    logger.error("操作失败:" + e.getMessage());
    return AjaxResult.error("操作失败");
}

捕获并记录任何可能发生的异常,以便于调试和日志追踪。

  1. 返回结果
kotlin 复制代码
return AjaxResult.success("操作成功", depositInfoList);

将解析后的数据封装到​​AjaxResult​​对象中并返回给前端。

总结

本文详细介绍了如何实现一个简单的TXT文件导入功能,并解析其内容以供进一步处理。希望这篇博客能帮助你更好地理解和实现类似的功能。

参考资料


以上就是本次的技术分享,如果有任何疑问或建议,欢迎在评论区留言讨论。

相关推荐
葫芦和十三8 小时前
图解 MongoDB 25|分片架构三件套:mongos、config server 和 shard
后端·mongodb·agent
plainGeekDev8 小时前
Gson → kotlinx.serialization
android·java·kotlin
葫芦和十三14 小时前
图解 MongoDB 26|片键设计:决定集群命运的一个决定
后端·mongodb·agent
Avan_菜菜15 小时前
使用 Docker + rclone 自建 WebDAV
后端·agent·claude
小bo波17 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
阳光是sunny17 小时前
别再被 worktree 绕晕了!AI 编程时代你必须掌握的 Git 隔离神器
前端·人工智能·后端
ethantan17 小时前
AI Agent 组成:像人一样思考的智能体
人工智能·程序员·架构
万少18 小时前
万少的博客 - 技术分享与解决方案
前端·javascript·后端
咖啡八杯18 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式