Чтение файла в ArrayList в Java

Научитесь считывать все строки из файла в ArrayList, используя API Java IO, Common IO и классы Guava.

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

1. Чтение всех строк в ArrayList

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

1.1. Files.readAllLines() в Java NIO

Метод readAllLines() считывает все строки из файла. Он также закрывает файл, когда все байты считаны или возникает ошибка ввода-вывода или другое исключение времени выполнения.

try {List<String> list = Files.readAllLines(new File("data.txt").toPath(), Charsets.UTF_8 );} catch(IOException e) {e.printStackTrace();}

1.2. Files.lines() Java NIO

Во многих случаях нам может понадобиться обрабатывать строки по мере их чтения. В таких случаях мы можем читать файл как поток и применять некоторые промежуточные действия к элементам потока по мере их обработки.

try(Stream<String> stream = Files.lines(Paths.get("data.txt"))) {ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));}catch(IOException e) {e.printStackTrace();}

1.3. Общие операции ввода-вывода FileUtils.readLines()

Этот метод также считывает содержимое файла построчно в Список строк. Файл всегда закрывается после завершения операции чтения.

try {List<String> lines = FileUtils.readLines(new File("data.txt"), StandardCharsets.UTF_8);} catch(IOException e) {e.printStackTrace();}

1.4 Файлы Гуавы.readLines()

Этот метод возвращает изменяемый список строк, содержащий все строки из файла.

Для ImmutableList используйте Files.asCharSource(file, charset).readLines().

try {List<String> lines = com.google.common.io.Files.readLines(new File("data.txt"), StandardCharsets.UTF_8);} catch(IOException e) {e.printStackTrace();}

2. Чтение файла построчно и сбор в список

Другой способ прочитать все строки в файле — прочитать файл по одной строке за раз в цикле while и добавить ее в список.

Это решение дает нам возможность выполнить необходимую очистку данных перед добавлением в список. Мы также можем выбрать, включать или отбрасывать строку.

2.1 Использование сканера

Сканер — это простой текстовый сканер, используемый для анализа примитивных типов и строк с использованием регулярных выражений.

Мы можем использовать метод nextLine() для чтения всей строки. Чтобы проверить, есть ли еще содержимое в файле, мы можем использовать метод hasNext().

try(Scanner s = new Scanner(new File("data.txt"))) {ArrayList<String> list = new ArrayList<>();while(s.hasNext()) {list.add(s.next());}} catch(FileNotFoundException e) {e.printStackTrace();}

2.2 Использование BufferedReader

Класс BufferedReader также предоставляет методы, аналогичные классу Scanner, которые можно использовать для чтения строки и проверки оставшегося содержимого в файле.

try(BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {ArrayList<String> list = new ArrayList<>();while(reader.ready()) {list.add(reader.readLine());}}catch(IOException e) {e.printStackTrace();}

3. Заключение

Как показано в обсуждаемых решениях, чтение всех строк из файла не является сложной задачей для решения. Мы можем принять решение на основе требований, требуется ли какая-либо промежуточная обработка перед добавлением строки в список или нет.

Исходный код на Github

Прокрутить вверх