1. Обзор
В этом уроке мы обсудим различные способы чтения файла в ArrayList .
Существует множество способов чтения файла в Java . Прочитав файл, мы можем выполнить множество операций с его содержимым.
Некоторые из этих операций, например сортировка, могут потребовать обработки всего содержимого файла в память. Для выполнения таких операций нам может понадобиться прочитать файл как Массив или Список строк или слов.
2. Использование FileReader
Самый простой способ чтения файла в Java-это использование FileReader . По определению, FileReader – это удобный класс для чтения потока символов из файла .
Существует несколько конструкторов, доступных для инициализации считывателя файлов :
FileReader f = new FileReader(String filepath); FileReader f = new FileReader(File f); FileReader f = new FileReader(FileDescriptor fd);
Все эти конструкторы предполагают, что кодировка символов по умолчанию и размер байтового буфера по умолчанию являются подходящими.
Однако, если мы хотим предоставить пользовательскую кодировку символов и размер байтового буфера, мы можем использовать InputStreamReader или FileInputStream .
В следующем коде мы продемонстрируем, как читать строки из файла в ArrayList, используя FileReader:
ArrayListresult = new ArrayList<>(); try (FileReader f = new FileReader(filename)) { StringBuffer sb = new StringBuffer(); while (f.ready()) { char c = (char) f.read(); if (c == '\n') { result.add(sb.toString()); sb = new StringBuffer(); } else { sb.append(c); } } if (sb.length() > 0) { result.add(sb.toString()); } } return result;
3. Использование BufferedReader
Хотя FileReader довольно прост в использовании, рекомендуется всегда оборачивать его с помощью BuffereReader при чтении файла.
Это происходит потому, что BufferedReader использует буфер char для одновременного считывания нескольких значений из потока ввода символов и, следовательно, уменьшает количество вызовов read () , выполняемых базовым FileStream .
Конструкторы для BufferedReader принимают Reader в качестве входных данных. Кроме того, мы также можем указать размер буфера в конструкторах, но для большинства случаев использования размер по умолчанию достаточно велик:
BufferedReader br = new BufferedReader(new FileReader(filename)); BufferedReader br = new BufferedReader(new FileReader(filename), size);
В дополнение к унаследованным методам от класса Reader , BufferedReader также предоставляет метод readLine() для чтения всей строки как строки :
ArrayListresult = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(filename))) { while (br.ready()) { result.add(br.readLine()); } }
4. Использование Сканера
Еще один распространенный способ чтения файлов-через Scanner .
Сканер это простой текстовый сканер, используемый для разбора примитивных типов и строк с использованием регулярных выражений.
При чтении файлов/| Scanner инициализируется с помощью объектов File или FileReader :
Scanner s = new Scanner(new File(filename)); Scanner s = new Scanner(new FileReader(filename));
Подобно BufferedReader, Scanner предоставляет readLine() метод для чтения всей строки . Дополнительно , он также предоставляет метод hasNext () , чтобы указать, доступно ли больше значений для чтения или нет:
ArrayListresult = new ArrayList<>(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextLine()); } return result; }
Scanner разбивает свои входные данные на токены с помощью разделителя, разделителем по умолчанию является пробел. Эти токены могут быть преобразованы в значения различных типов с помощью различных доступных методов next ( nextInt , nextLong и т. Д.):
ArrayListresult = new ArrayList<>(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextInt()); } return result; }
5. Использование Files.ReadAllLines
Вероятно, самый простой способ прочитать файл и разобрать все его строки в ArrayList – это использовать метод ReadAllLines () , доступный в классе Files :
Listresult = Files.readAllLines(Paths.get(filename));
Этот метод также может принимать параметр charset для чтения в соответствии с определенной кодировкой символов:
Charset charset = Charset.forName("ISO-8859-1"); Listresult = Files.readAllLines(Paths.get(filename), charset);
6. Заключение
Подводя итог, мы обсудили некоторые распространенные способы чтения содержимого файла в ArrayList . Кроме того, мы рассмотрели некоторые преимущества и недостатки различных методов.
Например, мы можем использовать BufferedReader для буферизации символов для повышения эффективности. В качестве альтернативы мы могли бы использовать Scanner для чтения примитива с помощью разделителей. Или, возможно, мы могли бы просто использовать Files.ReadAllLines(), не беспокоясь о базовой реализации.
Как обычно, код доступен в нашем репозитории GitHub .