编程语言
首页 > 编程语言> > Java Scanner打印上一行和下一行

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