前言
请各大网友尊重本人原创知识分享,谨记本人博客:南国以南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();
}
}
}
特别注意:
-
如果日志文件非常大,或者你需要处理多个提取,那么这种逐行读取和字符串拼接的方法可能不是最高效的。在这种情况下,你可能需要考虑使用更高效的字符串处理或文件处理策略。
-
这个代码只提取了第一个匹配的内容。如果你需要提取多个匹配的内容,你需要移除内部的break语句,并可能需要一个额外的逻辑来跟踪何时停止提取(例如,提取一定数量的内容或直到文件结束)。
总结
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!