Как мне снова прочитать файл, используя буферизованный ридер в Java? - PullRequest
1 голос
/ 04 октября 2010

У меня есть код Java, который читает входной файл с использованием буфера чтения, пока метод readLine() не вернет null.Мне нужно снова использовать содержимое файла неограниченное количество раз.Как я могу прочитать этот файл с самого начала снова?

Ответы [ 9 ]

2 голосов
/ 04 октября 2010

Вы можете закрыть и снова открыть его.Другой вариант: если он не слишком большой, поместите его содержимое, скажем, в список.

1 голос
/ 04 октября 2010

Один Reader должен использоваться один раз для чтения файла.Если вы хотите снова прочитать файл, создайте на его основе новый Reader.

Используя утилиты ввода-вывода Guava , вы можете создать красивую абстракцию, которая позволит вам читать файлстолько раз, сколько вы хотите, используя Files.newReaderSupplier (File, Charset) .Это дает вам InputSupplier , из которого вы можете получить новый Reader, вызвав getInput() в любое время.

Еще лучше, в Guava есть много служебных методов, которые используютиз InputSupplier s напрямую ... это избавляет вас от необходимости беспокоиться о закрытии поставляемого Reader самостоятельно.Класс CharStreams содержит большинство текстовых утилит ввода-вывода.Простой пример:

public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
  boolean needToDoMoreStuff = true;
  while (needToDoMoreStuff) {
    // this handles creating, reading, and closing the Reader!
    List<String> lines = CharStreams.readLines(readerSupplier);
    // do some stuff with the lines you read
  }
}

Учитывая File, вы можете вызвать этот метод следующим образом:

File file = ...;
doSomeStuff(Files.newReaderSupplier(file, Charsets.UTF_8)); // or whatever charset

Если вы хотите выполнить некоторую обработку для каждой строки без чтения каждой строки вво-первых, вы можете использовать перегрузку readLines, которая принимает LineProcessor .

1 голос
/ 04 октября 2010

Буферный ридер поддерживает reset () только в положение буферизованных данных. Но это не может перейти к началу файла (предположим, что файл больше, чем буфер).
Решения:
1.Reopen
2. Используйте RandomAccessFile

0 голосов
/ 05 октября 2015
try {
            BufferedReader br = new BufferedReader(new FileReader(input));

            while ((line = br.readLine()) != null)
            {
                //do somethng
            }
            br.close();
        }
        catch(IOException e)
        {
            System.err.println("Error: " + e.getMessage());

        }
}
0 голосов
/ 19 июня 2013

Я столкнулся с той же проблемой и пришел к этому вопросу.

1. Использование методов mark () и reset ():

BufferedReader может быть создан с использованием FileReader, а также FileInputStream. FileReader не поддерживает методы Mark и Reset. Я получил исключение, пока пытался это сделать. Даже когда я пытался с FileInputStream, я не мог сделать это, потому что мой файл был большим (даже, я думаю, ваш). Если длина файла больше буфера, то методы маркировки и сброса не будут работать ни с FileReader, ни с FileInputStream. Подробнее об этом в этом ответе от @ jtahlborn.

2. Закрытие и повторное открытие файла

Когда я закрыл и снова открыл файл и создал новый BufferedReader, он работал хорошо. Я думаю, что идеальный способ - это снова открыть файл и создать новый BufferedReader в качестве FileReader, или FileInputStream следует использовать только один раз для чтения файла.

0 голосов
/ 23 февраля 2011

вы делаете это, вызывая функцию run () рекурсивно, проверив, не видно ли больше строк - вот пример

// Reload the file when you reach the end (i.e. when you can't read anymore strings)
  if ((sCurrentLine = br.readLine()) == null) {
    run();
  }
0 голосов
/ 04 октября 2010

Не уверен, рассматривали ли вы методы mark() и reset() на BufferedReader

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

0 голосов
/ 04 октября 2010

я хотел бы предложить использовать общие библиотеки

http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

я думаю, что есть вызов, чтобы просто прочитать файл в byteArray, который может быть альтернативным подходом

0 голосов
/ 04 октября 2010

Если вы хотите сделать это, вы можете рассмотреть файл произвольного доступа .При этом вы можете явно установить позицию обратно в начало и начать чтение снова оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...