Java 解析文件内容逐行过滤提取


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i


提示:以下是本篇文章正文内容,下面案例可供参考

简介

要通过Java读取日志文件,并提取以特定前缀开头并以特定后缀结束的字符串内容可以使用 BufferedReader 来逐行读取文件,并使用一个标志位来跟踪是否已经提取过所需的内容。

代码实例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LogExtractor {
    public static void main(String[] args) {
        String filePath = "path/to/your/logfile.log"; // 替换为你的日志文件路径
        String prefix = "(implWithHBase)"; //前缀
        String suffix = "Application"; //后缀
        boolean extracted = false; // 标志位,用于跟踪是否已经提取过内容
        StringBuilder contentBuilder = new StringBuilder(); // 用于构建提取的内容

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                if (!extracted && line.contains(prefix)) {
                    // 如果当前行包含前缀且尚未提取过内容,则开始提取
                    contentBuilder.append(line.substring(line.indexOf(prefix) + prefix.length()));
                    extracted = true; // 设置标志位为已提取

                    // 继续读取后续行,直到找到后缀或文件结束
                    while ((line = br.readLine()) != null) {
                        contentBuilder.append("\n").append(line);
                        if (line.contains(suffix)) {
                            // 如果找到后缀,则停止提取
                            break;
                        }
                    }

                    // 如果在最后一行都没有找到后缀,则可能需要额外的处理(例如报错或继续搜索)
                    // 但在这个例子中,我们假设日志文件是格式正确的,并且后缀一定会存在

                    // 由于我们可能在循环的最后一次迭代中多读了一行(不包含后缀的下一行),
                    // 我们需要回退一步(但这在这个特定例子中不是必需的,因为我们只提取一次)
                    // 如果要处理多个提取,则需要注意这一点。

                    // 移除可能附加的额外换行符或空格(如果后缀是单独一行的话)
                    String extractedContent = contentBuilder.toString().trim();
                    if (extractedContent.endsWith(suffix)) {
                        // 如果提取的内容以后缀结束,则移除后缀
                        extractedContent = extractedContent.substring(0, extractedContent.length() - suffix.length()).trim();
                    }

                    // 输出提取的内容
                    System.out.println("Extracted Content:");
                    System.out.println(extractedContent);

                    // 由于只需要提取一次,所以退出循环
                    break;
                }
            }

            if (!extracted) {
                System.out.println("No matching content found.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

特别注意:

  1. 如果日志文件非常大,或者你需要处理多个提取,那么这种逐行读取和字符串拼接的方法可能不是最高效的。在这种情况下,你可能需要考虑使用更高效的字符串处理或文件处理策略

  2. 这个代码只提取了第一个匹配的内容。如果你需要提取多个匹配的内容,你需要移除内部的break语句,并可能需要一个额外的逻辑来跟踪何时停止提取(例如,提取一定数量的内容或直到文件结束)。

总结


我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值