Читать файл в ArrayList

Читать файл в ArrayList

1. обзор

В этом руководстве мы обсудимdifferent ways of reading a file into an ArrayList.

Есть много способовread a file in Java. Как только мы прочитаем файл, мы сможем выполнить множество операций с содержимым этого файла.

Некоторые из этих операций, например сортировка, могут потребовать обработки всего содержимого файла в памяти. Для выполнения таких операций нам может потребоваться прочитать файл какArray илиList строк или слов.

2. ИспользуяFileReader

Самый простой способ чтения файла в Java - использоватьFileReader. По определениюFileReader is a convenience class for reading stream of characters from a File.

Для инициализацииFileReader: доступно несколько конструкторов.

FileReader f = new FileReader(String filepath);
FileReader f = new FileReader(File f);
FileReader f = new FileReader(FileDescriptor fd);

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

Однако, если мы хотим предоставить настраиваемую кодировку символов и размер байтового буфера, мы можем использоватьInputStreamReader илиFileInputStream.

В следующем коде мы продемонстрируем, как читать строки из файла вArrayList,, используяFileReader:.

ArrayList result = 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 uses a char buffer to simultaneously read multiple values from a character-input stream and, следовательно, уменьшает количество вызововread(), сделанных базовымFileStream.

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

BufferedReader br = new BufferedReader(new FileReader(filename));
BufferedReader br = new BufferedReader(new FileReader(filename), size);

В дополнение к унаследованным методам от классаReader,BufferedReader also предоставляет методreadLine() для чтения всей строки какString:

ArrayList result = new ArrayList<>();

try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
    while (br.ready()) {
        result.add(br.readLine());
    }
}

4. ИспользуяScanner

Другой распространенный способ чтения файлов - черезScanner.

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

При чтении файловScanner инициализируется с использованием объектовFile илиFileReader:

Scanner s = new Scanner(new File(filename));
Scanner s = new Scanner(new FileReader(filename));

ПодобноBufferedReader, Scanner предоставляет методreadLine() для чтения всей строки. Дополнительноit также предоставляет методhasNext(), чтобы указать, доступны ли другие значения для чтения или нет :

ArrayList result = new ArrayList<>();

try (Scanner s = new Scanner(new FileReader(filename))) {
    while (s.hasNext()) {
        result.add(s.nextLine());
    }
    return result;
}

Scanner разбивает свой ввод на токены с помощью разделителя, разделителем по умолчанию является пробел. Эти токены можно преобразовать в значения разных типов, используя различные доступные методыnext  (nextInt,nextLong и т. Д.):

ArrayList result = new ArrayList<>();

try (Scanner s = new Scanner(new FileReader(filename))) {
    while (s.hasNext()) {
        result.add(s.nextInt());
    }
    return result;
}

5. ИспользуяFiles.readAllLines

Вероятно, самый простой способ прочитать файл и проанализировать все его строки вArrayList - использоватьreadAllLines() method available in Files class:

List result = Files.readAllLines(Paths.get(filename));

Этот метод также может принимать параметр charset для чтения согласно определенной кодировке символов:

Charset charset = Charset.forName("ISO-8859-1");
List result = Files.readAllLines(Paths.get(filename), charset);

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

Подводя итог, мы обсудили некоторые распространенные способы чтения содержимогоFile вArrayList. Также мы рассмотрели некоторые преимущества и недостатки различных методов.

Например, мы можем использоватьBufferedReader для буферизации символов для повышения эффективности. В качестве альтернативы мы могли бы использоватьScanner для чтения примитива с использованием разделителей. Или, возможно, мы могли бы просто использоватьFiles.readAllLines(),, не беспокоясь о базовой реализации.

Как обычно, код доступен в нашихGitHub repository.