Как я снова прочитал файл, используя буферизованный считыватель в Java?

StackOverflow https://stackoverflow.com/questions/3852276

  •  27-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

// Reload the file when you reach the end (i.e. when you can't read anymore strings)
  if ((sCurrentLine = br.readLine()) == null) {
    run();
  }

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

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

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

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

С использованием ГуаваУтилиты IO, вы можете создать хорошую абстракцию, которая позволяет прочитать файл столько раз, сколько вы хотите использовать Files.newReadersupplier (файл, charset). Отказ Это дает вам Inputsupplier.u003CInputStreamReader> что вы можете получить новый Reader от позвонинга getInput() в любое время.

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

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 перегрузка, которая принимает Линейный образец.

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

Я бы предложил призывать участие в библиотеках Commons

http://commons.apache.org/io/ap-release/org/apache/commons/io/fileutils.html.

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

Не уверен, что вы считаете mark() и reset() Методы на Буферреджер

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

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

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

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

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

Когда я закрыл и возобновил файл и создал новый буферредер, он работал хорошо. Идеальный способ, я думаю, это снова открыть файл и построить новый буферрезер в качестве Fileereader или FileInPutStream должен использоваться только один раз, чтобы прочитать файл.

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());

        }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top