返回文本文件中出现的所有行号的方法

时间:2015-04-05 05:25:54

标签: java java.util.scanner

我正在编写一个方法,它返回文本文件中出现的所有行号。 例如,如果"你好"是参数,它会搜索我的文本文件并返回所有行号"你好"发生在。

如果我的测试文件说:

  

您好
  我的名字是   是Java。

我方法的参数是"我的",它应该返回:

  

[2,3]

但是,我收到此错误:

  

线程中的异常" main"显示java.lang.NullPointerException
      在Indexer.lineNumbers(Indexer.java:41)
      在Indexer.main(Indexer.java:22)

这是我的代码:

public static String lineNumbers(String x) throws FileNotFoundException, IOException
   {
            LineNumberReader lineReader = new LineNumberReader(new FileReader("File.txt"));
            Scanner fileScanner = new Scanner(new File("File.txt"));
            String numbers = "[";
            while (fileScanner.hasNextLine())
            {
               String line = lineReader.readLine();
               if (line.contains(x))
               {
                  int lineNumber = lineReader.getLineNumber();
                  String numberString = Integer.toString(lineNumber);
                  numbers = (numbers + "," + numberString);
               }
            }
            return numbers + "]"; 
   }

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您正在尝试使用扫描仪和线路阅读器阅读相同的文件,这样您最终会踩到自己的脚趾。

试试这个:

public static String lineNumbers(String x) throws IOException
{
    LineNumberReader lineReader = new LineNumberReader(new FileReader("/Users/alfasi/tpstats-eu-west-1.log"));
    String numbers = "";
    String line;
    while ((line = lineReader.readLine()) != null)
    {
        if (line.contains(x))
        {
            numbers += "," + lineReader.getLineNumber();
        }
    }
    return "[" + numbers.substring(1) + "]";
}

答案 1 :(得分:1)

您可以考虑的替代方案是将行号放在ArrayList中,然后您可以在另一个进程中迭代:

public static ArrayList<Integer> lineNumbers(String x) 
        throws FileNotFoundException, IOException {
    ArrayList<Integer> lineNumbers = new ArrayList<Integer>();
    Scanner fileScanner = new Scanner(new File("File.txt"));
    int lineNumber = 0;
    while (fileScanner.hasNextLine()) {
        String line = fileScanner.nextLine();
        lineNumber++;
        if (line.contains(x)) {
            lineNumbers.add(lineNumber);
        }
    }
    return lineNumbers;
}

然后尝试循环遍历您得到的值:

String searchFor = "is";
for(int i : lineNumbers(searchFor)) {
    System.out.println(i);
}