Я хотел бы прочитать одну строку файла .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 переходит на следующую строку, разве я не пропускаю одну букву?
Спасибо за внимание !
Спасибо за Ваш ответ ! Я немного отредактировал свое сообщение, потому что оно не совсем понятно, извините!
Почему бы вам не просмотреть свой код с помощью отладчика и не посмотреть, что он делает?




Вы можете попробовать что-то вроде этого:
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 в качестве следующего шага.
Ну, вы всегда можете использовать цикл while вместо цикла for. Конкатенация в моем потоке была просто примером, там можно использовать любую бинарную функцию. Я не знаю, что именно вы хотите сделать с обеими строками, но вы можете попробовать использовать для этого сокращение.
Я создаю график, на котором я помещаю первую строку в качестве источника и следующую строку в качестве цели. Мне нужно проверить, является ли каждая пара строк соединениями, которые мне нужны для моего графика (проверка другого столбца CSV-файла), потому что на моем графике следует избегать некоторых пар. Извините, если это немного туманно, но я не хочу, чтобы люди полностью решали мои проблемы, поэтому я ничего не делаю.
Я бы использовал двухэлементный массив 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-файлами. Однако мне нужно работать со многими файлами одновременно, и вручную вычислять последние строки не очень удобно.
Хорошо. После прочтения А и Б вам не нужно снова читать Б. У вас уже есть это!