Java 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);
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行.
解决方法:
any pointers to print previous 5 lines..?
>将它们保存在Dequeue< String>例如LinkedList< String>其“先进先出(FIFO)”行为.
>或者使用5个变量或5个字符串数组,将字符串从一个插槽或变量手动移至另一插槽或变量,然后打印它们.
>如果您使用Dequeue / LinkedList,请使用Dequeue的addFirst(…)方法将新的String添加到开头,并使用removeLast()删除列表的最后一个String(如果其大小大于5).遍历LinkedList以获取其中包含的当前字符串.
其他建议:
>扫描程序的支票scanner.hasNextXXX()方法应与get方法scanner.nextXXX()相匹配.因此,如果要调用nextLine(),则应检查hasNextLine().否则,您可能会遇到问题.
>请在您的问题中尝试在此处发布真实的代码,而不是进行排序,它们永远不会编译代码.即system.out.println与System.out.println.我知道这是一件小事,但是当其他人尝试使用您的代码时,这意义重大.
>使用ArrayList的contains(…)方法摆脱for循环.
例如.,
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();
}
编辑
您发表评论:
ok i ran small test program to see if the contains(…) method works …
<unreadable unformatted code>
… and this returned keyword not found…!
这就是您使用它的全部方式. contains(…)方法用于检查Collection是否包含另一个对象.如果您喂它一个可能使用或可能不使用集合中字符串之一的巨大String,它将不起作用,但是将对组成较大String的单个String起作用.例如:
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);
}
}
另外,您将要避免在注释中发布代码,因为它们不保留其格式并且不可读和不可测试.而是编辑您的原始问题并发表评论以提醒我们进行编辑.
编辑2
根据dspyz:
For stacks and queues, when there isn’t any significant functionality/performance reason to use one over the other, you should default to ArrayDeque rather than LinkedList. It’s generally faster, takes up less memory, and requires less garbage collection.
标签:java-util-scanner,java 来源: https://codeday.me/bug/20191011/1890823.html