【问题标题】:Get current line number from bufferedReader从 bufferedReader 获取当前行号
【发布时间】:2020-02-17 13:48:06
【问题描述】:

我有不同的文本文件我想阅读,我正在使用BufferedReader,如下所示:

int theMax = 0;
    int theTypes = 0;
    int []theSlices = {};
    /*
        INPUT1:
        17 4
        2 5 6 8  

        INPUT2:
        100 10
        4 14 15 18 29 32 36 82 95 95                                

    */

    try {
        FileReader reader = new FileReader("INPUT1.in");
        BufferedReader bufferedReader = new BufferedReader(reader);

        String line;

        while ((line = bufferedReader.readLine()) != null) {
            String[] numbers = line.split(" ");

            System.out.println(numbers[0]);
            System.out.println(line);
        }
        reader.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
    ;

我的问题是我想设置theMaxtheTypestheSlices 的值,但为此我需要获取当前行号,但我不知道该怎么做。读取文件有效,println(numbers[0] 打印 17 和 2。我有点卡在这里,所以我很高兴得到每一个帮助。

INPUT1 示例: theMax = 17 theTypes = 4 theSlices = 2 5 6 8

【问题讨论】:

    标签: java bufferedreader filereader


    【解决方案1】:

    很简单:你自己跟踪。

        String line;
        int currentLine = 0;
    
        while ((line = bufferedReader.readLine()) != null) {
            String[] numbers = line.split(" ");
    
            System.out.println("Linenumber " + currentLine);
            System.out.println(numbers[0]);
            System.out.println(line);
            currentLine ++;
        }
        reader.close();
    

    【讨论】:

      【解决方案2】:

      不确定我是否完全理解您的需求,但为了跟踪行号,请创建一个变量,您可以在 while 循环中递增

      try {
              FileReader reader = new FileReader("INPUT1.in");
              BufferedReader bufferedReader = new BufferedReader(reader);
      
              String line;
              long currentLineNr = 0;
              while ((line = bufferedReader.readLine()) != null) {
                  currentLineNr++;
                  String[] numbers = line.split(" ");
      
                  System.out.println(numbers[0]);
                  System.out.println(line);
                  //Use the currentLineNr how you like
              }
              reader.close();
      
          } catch (IOException e) {
              e.printStackTrace();
          }
      

      【讨论】:

        【解决方案3】:

        首先,据我所知(并在此处阅读了官方 Java 文档 - https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html),BufferedReader 类本身并没有为您提供一种机制(例如 getCurrentLine() 方法)来确定当前行。

        但是,绝对没有什么可以阻止您自己通过计数器变量来跟踪当前行号。

        因此,您的代码的相关部分如下所示:

                int currentLine = 0;
                while ((line = bufferedReader.readLine()) != null) {
                    currentLine++;
        
                    String[] numbers = line.split(" ");
        
                    /* NOTE: this can be numbers.length >= 2 if you don't care to enforce 
                    having exactly 2 numbers as the first line 
                    */
                    if(currentLine == 1 && numbers.length == 2) {
                            theMax = Integer.valueOf(numbers[0]);
                            theTypes = Integer.valueOf(numbers[1]);
                    } else {
                        for(int index = 0; index < numbers.length; index++) {
                                theSlices[index] = Integer.valueOf(numbers[index]);
                        }
                    }
                }
                // do something with read values
        

        我还想提一下,您的代码可以在这里和那里改进,例如:

        1. 您可以将 try 替换为 try-with-resources,这样即使发生异常,您的阅读器也会自动管理/关闭。
        2. 如果您决定不使用 try-with-resources,则需要将 reader.close() 方法调用移动到 finally 块中,因为如果实际发生异常,您永远不会关闭资源。李>
        3. 这两行
                FileReader reader = ;
                BufferedReader bufferedReader = new BufferedReader(reader);
        

        可以简化为:

                BufferedReader bufferedReader = new BufferedReader(new FileReader("INPUT1.in"));
        

        如果坚持使用 try 而不是 try-with-resources,则只需要管理 bufferedReader 实例。

        希望这会有所帮助。

        PS:不是说我上面的sn-p代码是完美的,我相信它可以写得更干净

        【讨论】:

        • 如果删除了 try/catch 块,这将是一个更好的答案。盲目地用零填充数组可能不是对格式错误的输入字符串的最佳响应。
        【解决方案4】:

        使用java.io.LineNumberReader

        LineNumberReaderBufferedReader 的子类,用于跟踪行号。它提供了一个getLineNumber() 方法来获取当前行号。

        https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/LineNumberReader.html

        示例:

        import java.io.FileReader;
        import java.io.IOException;
        import java.io.LineNumberReader;
        
        public class Example {
            public static void main(String[] args) throws IOException {
                try (FileReader fr = new FileReader("input.txt");
                     LineNumberReader r = new LineNumberReader(fr)) {
                    String next;
                    while ((next = r.readLine()) != null) {
                        System.out.println("line number " + r.getLineNumber() + " = " + next);
                    }
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2013-02-06
          • 2021-06-04
          • 2012-09-06
          • 2012-09-15
          • 1970-01-01
          • 2015-10-08
          • 1970-01-01
          • 2013-06-27
          • 2021-04-21
          相关资源
          最近更新 更多