Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于打印上一行和下一行的Java扫描仪_Java_Java.util.scanner - Fatal编程技术网

用于打印上一行和下一行的Java扫描仪

用于打印上一行和下一行的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);

我正在使用“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行的指针吗

有打印前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);
     }
  }