Получить номер текущей строки из bufferedReader - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть разные текстовые файлы, которые я хотел бы прочитать, и я использую 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();
    }
    ;

Моя проблема в том, что я хотел бы установить значения для theMax , theTypes & theSlices но для этого мне нужно получить текущий номер строки, и я понятия не имею, как это сделать. Чтение файла работает и println(numbers[0] печатает 17 и 2. Я застрял здесь, поэтому я рад за любую помощь.

Пример для INPUT1: theMax = 17 theTypes = 4 theSlices = 2 5 6 8

Ответы [ 3 ]

2 голосов
/ 17 февраля 2020

Очень просто: вы сами отслеживаете.

    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();
1 голос
/ 17 февраля 2020

Прежде всего, насколько я знаю (и, прочитав официальную документацию 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. Вы можете заменить Ваша попытка с использованием ресурсов с попытками, так что ваши читатели управляются / закрываются автоматически, даже если возникает исключение.
  2. Если вы решите не использовать попытку с ресурсами, вам нужно будет переместить вызов метода reader.close () в блоке finally, потому что если действительно происходит исключение, вы никогда не закрываете свой ресурс.
  3. Эти 2 строки
        FileReader reader = ;
        BufferedReader bufferedReader = new BufferedReader(reader);

можно упростить до:

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

, и тогда вам нужно только управлять экземпляром bufferedReader, если придерживаться попытки вместо попытки с ресурсами.

Надеюсь, это поможет.

PS: я не говорю, что мой фрагмент кода выше идеален, я уверен, что он может быть написан более чисто

1 голос
/ 17 февраля 2020

Не уверен, что я полностью понимаю, что вы ищете, но просто для отслеживания номеров строк, создайте переменную, которую вы увеличиваете в то время как l oop

т.е.

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