从 bufferedReader 获取当前行号

Get current line number from bufferedReader

我想阅读不同的文本文件,我正在使用 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

很简单:你自己跟踪。

    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();

不确定我是否完全理解您的需求,但为了跟踪行号,创建一个变量,您可以在 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();
    }

首先,据我所知(并且在此处阅读了官方 Java 文档 - https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html),BufferedReader class 本身并没有给你确定当前行的机制(例如 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,这样即使发生异常,您的读者也会 managed/closed 自动。
  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: 不是说我上面的代码片段是完美的,我相信它可以写得更干净

使用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);
            }
        }
    }
}