JAVA解析文本文件

解析文本文件,到24点会生成一个新的文本文件,24点后的文本内容不全,有些基本信息在昨天的文件,内容有时间(凌晨的时分秒),怎么设计解析24点后文件时候识别该文件不全需要+上一个文件的内容进行解析

我大概理解你的意思了,我写个demo,你看下是否符合你的要求。
你可以通过检查当前文件的创建时间来确定该文件是否为完整的日志文件。如果当前文件的创建时间是在今天的 00:00:00 之前,那么该文件不是完整的日志文件,需要将其与昨天的日志文件合并。

以下是一个示例实现:

public class LogParser {
    private File currentFile;
    private File previousFile;

    public void parseLog() {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();

        // 构造当前日志文件的路径
        String currentFilePath = "logs/" + now.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".log";
        currentFile = new File(currentFilePath);

        if (!currentFile.exists()) {
            // 如果当前日志文件不存在,说明还没有生成,无需解析
            return;
        }

        if (currentFile.lastModified() < getTodayZeroTime(now).toEpochSecond(ZoneOffset.of("+8"))) {
            // 如果当前日志文件的创建时间早于今天的 00:00:00,说明该文件不是完整的日志文件
            // 需要将其与昨天的日志文件合并
            String previousFilePath = "logs/" + now.minusDays(1).format(DateTimeFormatter.ofPattern("yyyyMMdd")) +".log";
            previousFile = new File(previousFilePath);

            if (!previousFile.exists()) {
                // 如果昨天的日志文件不存在,无法解析
                return;
            }

            // 合并当前日志文件和昨天的日志文件
            List<String> lines = new ArrayList<>();
            try (Stream<String> currentLogStream = Files.lines(currentFile.toPath());
                 Stream<String> previousLogStream = Files.lines(previousFile.toPath())) {
                Stream.concat(previousLogStream, currentLogStream).forEach(lines::add);
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 解析合并后的日志文件
            parseLogLines(lines);
        } else {
            // 当前日志文件为完整的日志文件,直接解析
            List<String> lines = null;
            try {
                lines = Files.readAllLines(currentFile.toPath());
            } catch (IOException e) {
                e.printStackTrace();
            }
            parseLogLines(lines);
        }
    }

    private void parseLogLines(List<String> lines) {
        // 解析日志文件
        // ...
    }

    private LocalDateTime getTodayZeroTime(LocalDateTime dateTime) {
        return LocalDateTime.of(dateTime.getYear(), dateTime.getMonth(), dateTime.getDayOfMonth(), 0, 0, 0);
    }
}

parseLog 方法中,你首先构造当前日志文件的路径,并检查该文件是否存在。如果当前日志文件不存在,说明还没有生成,无需解析。如果当前日志文件存在,你检查该文件的创建时间是否早于今天的 00:00:00。如果是,说明该文件不是完整的日志文件,需要将其与昨天的日志文件合并。

在合并日志文件时,你首先构造昨天日志文件的路径,并检查该文件是否存在。如果昨天日志文件不存在,无法解析。如果昨天日志文件存在,你使用 Files.lines 方法将两个文件的内容合并为一个流,然后使用 forEach 方法将流中每个元素添加到一个列表中。最后,你解析合并后的日志文件。

如果当前日志文件的创建时间晚于今天的 00:00:00,说明该文件是完整的日志文件,你直接解析该文件的内容。

在解析日志文件时,你可以根据具体的文本格式和解析需求实现相应的代码。

统一以某个最先出现的字段作为放入哪个文件的依据
读取的时候,据此判断是否读取之前的文件。

基本信息+内容存入java对象中,再把java对象里面的信息存入文本文件中,这样可保证基本信息与内容进行绑定

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/358096
  • 这篇博客也不错, 你可以看下提高开发和发布效率-创建不依赖于外部环境可独立运行java程序的项目(一):基础篇
  • 除此之外, 这篇博客: java学生宿舍管理系统,来了就点个赞再走呗,即将毕业的兄弟有福了中的 一张界面图: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

  • 您还可以看一下 邱石老师的java后台+微信小程序 实现完整的点餐系统课程中的 8定义一个方法实现加法和减法小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题描述: 需要在JAVA中解析一份文本文件,并且在新文件生成时自动合并前一天的文件信息,具体来说就是需要将两个文件的内容合并到同一个文件中,并且在文件生成时自动添加之前文件的内容。另外,需要在判断文件信息是否全面时,需要判断是在24点之后,如果是在24点之后,则需要判断文件内容是否完整。

    解决方案: 1. 解析文本文件 可以使用JAVA的IO流读取文本文件,并且将文件内容转换为字符串。具体代码如下:

    String content = new String(Files.readAllBytes(Paths.get("your_file_path")), StandardCharsets.UTF_8);
    
    1. 自动合并前一天的文件信息 判断前一天的文件是否存在,如果存在,则将文件内容合并到当前文件中。具体代码如下:
    String yesterdayFilePath = "your_yesterday_file_path";
    File yesterdayFile = new File(yesterdayFilePath);
    if (yesterdayFile.exists()) {
        String yesterdayContent = new String(Files.readAllBytes(Paths.get(yesterdayFilePath)), StandardCharsets.UTF_8);
        content = yesterdayContent + content;
    }
    
    1. 判断24点之后的文件信息是否完整 可以使用定时器,在24点后执行任务,判断文件内容是否完整。具体代码如下:
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            File file = new File("your_file_path");
            long fileLastModified = file.lastModified();
            long now = System.currentTimeMillis();
            long timeDiff = now - fileLastModified;
    
            if (timeDiff >= 24 * 60 * 60 * 1000 && timeDiff < 48 * 60 * 60 * 1000) {
                String fileContent = new String(Files.readAllBytes(Paths.get("your_file_path")), StandardCharsets.UTF_8);
                if (fileContent.isEmpty()) {
                    //文件信息不全
                }
            }
        }
    };
    Timer timer = new Timer();
    timer.schedule(task, 24 * 60 * 60 * 1000); //每天24点执行
    

    注意:以上代码仅供参考,具体实现需要根据业务逻辑进行相应的调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^