用于打印上一行和下一行的Java扫描仪
我正在使用“java.util.Scanner”读取和扫描关键字,并希望打印遇到的关键字的前5行和后5行,下面是我的代码用于打印上一行和下一行的Java扫描仪,java,java.util.scanner,Java,Java.util.scanner,我正在使用“java.util.Scanner”读取和扫描关键字,并希望打印遇到的关键字的前5行和后5行,下面是我的代码 ArrayList<String> keywords = new ArrayList<String>(); keywords.add("ERROR"); keywords.add("EXCEPTION"); java.io.File file = new java.io.File(LOG_FILE);
ArrayList<String> keywords = new ArrayList<String>();
keywords.add("ERROR");
keywords.add("EXCEPTION");
java.io.File file = new java.io.File(LOG_FILE);
Scanner input = null;
try {
input = new Scanner(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
int count = 0;
String previousLine = null;
while(input.hasNext()){
String line = input.nextLine();
for(String keyword : keywords){
if(line.contains(keyword)){
//print prev 5 lines
system.out.println(previousLine); // this will print only last previous line ( i need last 5 previous lines)
???
//print next 5 lines
system.out.println(input.nextLine());
system.out.println(input.nextLine());
system.out.println(input.nextLine());
system.out.println(input.nextLine());
system.out.println(input.nextLine());
}
previousLine = line;
}
有打印前5行的指针吗
有打印前5行的指针吗
将它们保存在诸如LinkedList之类的出列中,以实现其先进先出FIFO行为。
或者使用5个变量或5个字符串的数组,手动将字符串从一个插槽或变量移动到另一个插槽或变量,然后打印它们。
如果使用出列/LinkedList,请使用出列的addFirst。。。方法将新字符串添加到开头,如果列表的大小大于5,则removeLast将删除列表的最后一个字符串。遍历LinkedList以获取其包含的当前字符串。
其他建议:
扫描仪的check Scanner.hasNextXXX方法应与get方法Scanner.nextXXX匹配。所以如果你要打电话给nextLine,你应该检查hasNextLine。否则你就有问题的风险。
请试着在你的问题中发布真实的代码,而不是那种永远不会编译代码的问题。i、 例如,system.out.println与system.out.println。我知道这是一件小事,但当其他人尝试使用您的代码时,这意味着很多。
使用ArrayList的包含项。。。方法来消除for循环的。
e、 g
此外,您将希望避免在注释中发布代码,因为它们不保留格式,并且不可读且不稳定。相反,编辑您的原始问题并发表评论以提醒我们编辑
编辑2
根据dspyz:
对于堆栈和队列,如果没有任何重要的功能/性能原因需要使用一个而不是另一个,则应默认使用ArrayQue而不是LinkedList。它通常更快,占用更少的内存,需要更少的垃圾收集 有打印前5行的指针吗 将它们保存在诸如LinkedList之类的出列中,以实现其先进先出FIFO行为。 或者使用5个变量或5个字符串的数组,手动将字符串从一个插槽或变量移动到另一个插槽或变量,然后打印它们。 如果使用出列/LinkedList,请使用出列的addFirst。。。方法将新字符串添加到开头,如果列表的大小大于5,则removeLast将删除列表的最后一个字符串。遍历LinkedList以获取其包含的当前字符串。 其他建议: 扫描仪的check Scanner.hasNextXXX方法应与get方法Scanner.nextXXX匹配。所以如果你要打电话给nextLine,你应该检查hasNextLine。否则你就有问题的风险。 请试着在你的问题中发布真实的代码,而不是那种永远不会编译代码的问题。i、 例如,system.out.println与system.out.println。我知道这是一件小事,但当其他人尝试使用您的代码时,这意味着很多。 使用ArrayList的包含项。。。方法来消除for循环的。 e、 g 此外,您将希望避免在注释中发布代码,因为它们不保留格式,并且不可读且不稳定。相反,编辑您的原始问题并发表评论以提醒我们编辑 编辑2 根据dspyz:
对于堆栈和队列,如果没有任何重要的功能/性能原因需要使用一个而不是另一个,则应默认使用ArrayQue而不是LinkedList。它通常更快,占用更少的内存,需要更少的垃圾收集
如果您的文件小于一百万行,则最好将这些行复制到ArrayList中,然后使用随机访问将下一行和前5行复制到数组中 有时,最好的解决办法只是简单的暴力 如果在+-5行窗口中有两个关键字命中,那么代码将变得棘手。假设你有两条线相隔。你有两个10行窗口吗?一个12行窗口
随机访问将使实现这种方式更容易 如果您的文件小于一百万行,则最好只将行复制到ArrayList中,然后使用随机访问将下一行和前5行复制到数组中 有时,最好的解决办法只是简单的暴力 如果在+-5行窗口中有两个关键字命中,那么代码将变得棘手。假设你有两条线相隔。你有两个10行窗口吗?一个12行窗口
随机访问将使实现这种方式更容易 首先,为没有放置正确的代码/语法而道歉。非常感谢您的帮助,我尝试了上面的代码,发现了2个问题:1.使用ArrayList的contains。。。没有工作它从来没有找到关键字,所以我不得不切换回for循环。2.我看到重复的行打印了两次或两次times@aeinstein83:运行一个小测试程序,查看是否包含。。。这个方法很有效,因为它确实对我很有效。A对于重复项,可能是因为在哪个块中嵌套了什么代码。同样,上面的代码对我来说非常有用。要调试后者,请使用调试器或println语句查找sour
逻辑问题的ce。如果您将此行keywords.containsline从气垫船答案更改为keywords.containsline.trim,则代码可能适合您,该行可能包含空格,这可能是ArryList的原因。contains方法对您不起作用。谢谢您的建议,我认为这会起作用,但仍然不走运。采样线是LINE1。本地异常堆栈:第2行。异常[EclipseLink-4002]Eclipse持久性服务-2.4.0.v20120608-r11652:org.Eclipse.Persistence.exceptions.DatabaseException第3行。内部异常:org.apache.tomcat.dbcp.dbcp.SQLNestedException:无法获取连接,池错误等待空闲对象LINE4超时。错误代码:0对于堆栈和队列,如果没有任何重要的功能/性能原因可以使用其中一个而不是另一个,则应默认为ArrayQue,而不是LinkedList。它通常更快,占用更少的内存,需要更少的垃圾收集。非常感谢您的帮助,我尝试了上面的代码,发现了2个问题:1.使用ArrayList的contains。。。没有工作它从来没有找到关键字,所以我不得不切换回for循环。2.我看到重复的行打印了两次或两次times@aeinstein83:运行一个小测试程序,查看是否包含。。。这个方法很有效,因为它确实对我很有效。A对于重复项,可能是因为在哪个块中嵌套了什么代码。同样,上面的代码对我来说非常有用。要调试后者,请使用调试器或println语句查找逻辑问题的根源。如果您将此行keywords.containsline从气垫船答案更改为keywords.containsline.trim,则代码可能适合您,该行可能包含空格,这可能是ArryList出现错误的原因。contains方法对您不起作用。谢谢您的建议,我认为这会起作用,但仍然不走运。采样线是LINE1。本地异常堆栈:第2行。异常[EclipseLink-4002]Eclipse持久性服务-2.4.0.v20120608-r11652:org.Eclipse.Persistence.exceptions.DatabaseException第3行。内部异常:org.apache.tomcat.dbcp.dbcp.SQLNestedException:无法获取连接,池错误等待空闲对象LINE4超时。错误代码:0对于堆栈和队列,如果没有任何重要的功能/性能原因可以使用其中一个而不是另一个,则应默认为ArrayQue,而不是LinkedList。它通常更快,占用更少的内存,需要更少的垃圾收集。
LinkedList<String> fivePrevLines = new LinkedList<>();
java.io.File file = new java.io.File(LOG_FILE);
Scanner input = null;
try {
input = new Scanner(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while (input.hasNextLine()) {
String line = input.nextLine();
if (keywords.contains(line)) {
System.out.println("keyword found!");
for (String prevLine : fivePrevLines) {
System.out.println(prevLine);
}
} else {
fivePrevLines.addFirst(line);
if (fivePrevLines.size() > 5) {
fivePrevLines.removeLast();
}
}
}
if (input != null) {
input.close();
}
ArrayList<String> temp = new ArrayList<String>();
temp.add("error");
temp.add("exception");
String s = "Internal Exception: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object";
String[] tokens = s.split("[\\s\\.:,]+");
for (String token : tokens) {
if (temp.contains(token.toLowerCase())) {
System.out.println("keyword found: " + token);
} else {
System.out.println("keyword not found: " + token);
}
}