Есть ли способ прочитать одну строку и следующую, перебирая файл .txt в Java?

Я хотел бы прочитать одну строку файла .txt с помощью BufferReader. Но мой вопрос в том, что мне нужно прочитать одну строку и следующую вместе, а затем перейти к следующей строке и сделать это снова со следующей. Вот пример:

A
B
C
D

Мне нужно прочитать A и B (и обработать), затем B и C (обработать), затем C и D.

Нужно ли мне создавать массив для хранения каждой пары, а затем обрабатывать? Или я могу обрабатывать при переборе файла? В настоящее время я делаю это:

while (file = in.readLine() != null) {
            String[] data = file.split(",");
            String source = data[0];
            file = in.readLine();
            String destination = data[0];        
        }

Здесь цель состоит в том, чтобы поместить предыдущий пункт назначения в качестве следующего источника. Но тогда, когда мой цикл while переходит на следующую строку, разве я не пропускаю одну букву?

Спасибо за внимание !

Хорошо. После прочтения А и Б вам не нужно снова читать Б. У вас уже есть это!

Seelenvirtuose 25.12.2020 14:24

Спасибо за Ваш ответ ! Я немного отредактировал свое сообщение, потому что оно не совсем понятно, извините!

Winver 25.12.2020 14:37

Почему бы вам не просмотреть свой код с помощью отладчика и не посмотреть, что он делает?

tgdavies 26.12.2020 08:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать что-то вроде этого:

        String a = in.readLine();
        if (a == null) {
            return;
        }
       
        for (String b; (b = in.readLine()) != null; a = b) {
            // do smth
            
        }

Возможно, вам также будет полезна операция сокращения конвейера Stream. Например, если вы хотите соединить все строки вместе:

   Optional<String> reduce = in.lines().reduce("", (a,b) -> a+b);
   if (reduce.isPresent()) {
     // ..
   } else {
     // ...
   }

Спасибо за ваш ответ ! Я работаю с CSV-файлами, поэтому не думаю, что смогу объединить их все, что сделает невозможным чтение. Однако использование цикла for выглядит хорошо. Я не знал, что мы можем поставить a = b в качестве следующего шага.

Winver 25.12.2020 16:32

Ну, вы всегда можете использовать цикл while вместо цикла for. Конкатенация в моем потоке была просто примером, там можно использовать любую бинарную функцию. Я не знаю, что именно вы хотите сделать с обеими строками, но вы можете попробовать использовать для этого сокращение.

Dorian Gray 25.12.2020 16:57

Я создаю график, на котором я помещаю первую строку в качестве источника и следующую строку в качестве цели. Мне нужно проверить, является ли каждая пара строк соединениями, которые мне нужны для моего графика (проверка другого столбца CSV-файла), потому что на моем графике следует избегать некоторых пар. Извините, если это немного туманно, но я не хочу, чтобы люди полностью решали мои проблемы, поэтому я ничего не делаю.

Winver 25.12.2020 17:14

Я бы использовал двухэлементный массив String в качестве «буфера».

String[] buffer = new String[2];
try (FileReader fr = new FileReader("path-to-your-file");
     BufferedReader br = new BufferedReader(fr)) {
    String line = br.readLine();
    while (line != null) {
        if (buffer[0] == null) {
            buffer[0] = line;
        }
        else if (buffer[1] == null) {
            buffer[1] = line;
        }
        else {
            // Do whatever to the contents of 'buffer'
            buffer[0] = buffer[1];
            buffer[1] = line;
        }
        line = br.readLine();
    }
    // Do whatever to the contents of 'buffer'
}
catch (IOException xIo) {
    xIo.printStackTrace();
}

Когда вы выходите из цикла while, вы не обработали последние две строки файла, поэтому вам нужно выполнить обработку в последний раз после выхода из цикла.

Спасибо за ваш ответ ! Работа с String[] может быть хорошей, особенно если учесть, что я работаю с CSV-файлами. Однако мне нужно работать со многими файлами одновременно, и вручную вычислять последние строки не очень удобно.

Winver 25.12.2020 16:29

Другие вопросы по теме