从BufferedReader获取当前行号

3

我有不同的文本文件需要读取,我正在使用 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。我有点卡在这里,所以很高兴得到所有帮助。
输入1的示例: theMax= 17 theTypes= 4 theSlices= 2 5 6 8
4个回答

3
非常简单:你自己跟踪。
    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
使用java.io.LineNumberReaderLineNumberReaderBufferedReader的子类,可以跟踪行号。它提供了一个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);
            }
        }
    }
}

1
我会尽力帮您翻译以下内容,这是与编程有关的中文文本:

我不太确定我完全理解你想要什么,但如果只是为了跟踪行号,可以创建一个变量,在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();
    }

1
首先,据我所知(并且在此处阅读了官方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-with-resources替换try,这样即使发生异常,您的读取器也会被自动管理/关闭。
  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:并不是说我上面的代码片段是完美的,我相信它可以更清晰地编写。


如果移除try/catch块,这将是一个更好的答案。盲目地用零填充数组可能不是对格式错误的输入字符串的最佳响应。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接