как заставить буферизованное средство чтения читать с самого начала вместо использования другого объекта

#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. Таким образом, он также прочитал бы вторую строку.