#java #bufferedreader
#java #bufferedreader
Вопрос:
В приведенном ниже написанном коде я хочу, чтобы второй цикл while выполнял чтение из второй строки того же файла, который используется первым циклом while. На данный момент второй цикл while выполняет чтение из третьей строки файла. Я могу сделать это, используя другое буферизованное средство чтения. но есть ли другой способ получше?
filename = data1
readFile = new File(filename);
BufferedReader reader = null;
try
{
reader = new BufferedReader( new FileReader(readFile) );
}
catch (IOException ioe)
{
System.err.println("Error: " e.getMessage());
}
String newline;
int secondRecord = 0;
while((secondRecord < 2) amp;amp; ((newline = readline(reader)) != null))
{
System.out.println(newline);
secondRecord ;
}
while ((newline = readline(reader)) != null)
{
System.out.println(newline);
}
Комментарии:
1. Когда вы получаете исключение, лучше не продолжать, как будто этого не происходило.
Ответ №1:
BufferedReader поддерживает mark()
и reset()
. Таким образом, вы должны вызывать mark()
перед вашим первым циклом и reset()
после него, и тогда он сможет снова прочитать те же строки.
Конечно, делайте это, только если файл не слишком большой, поскольку BufferedReader для этого должен хранить все в памяти.
Ответ №2:
Я бы прочитал файл в виде списка и обработал список так, как вы хотите.
List<String> lines = FileUtils.readLines(readFile);
for(String line: lines.subList(0,2))
System.out.println("first loop " line);
for(String line: lines.subList(2, lines.size()))
System.out.println("second loop " line);
Комментарии:
1. Не рекомендуется для больших файлов!
2. @Don, хорошая мысль, однако, учитывая, что файл содержит как минимум 2 строки, он может быть не таким большим. Я бы посчитал файл размером 100 МБ большим, а файл объемом 1 ГБ — огромным.
Ответ №3:
Вы можете поместить метку в точку, к которой вы хотите вернуться позже. (При использовании файла не потребуется слишком большой буфер чтения).
Ответ №4:
Мне следовало использовать цикл do while вместо второго while. Таким образом, он также прочитал бы вторую строку.