Вступление
В этом уроке мы будем считывать файл в строку на Java. Существует несколько способов чтения текстового содержимого файла.
Вот список всех классов и методов, которые мы рассмотрим:
- Файлы.строки()
- Файлы.Строка чтения()
- Файлы.ReadAllBytes()
- Устройство для чтения файлов
- Буферизатор
- Сканер
Файлы.строки()
Класс Files
содержит статические методы для работы с файлами и каталогами. Полезным методом является lines ()
, который возвращает поток строк: Поток<Строка>
. Из этого потока можно получить строки, содержащиеся в файле.
Метод принимает Путь
к файлу, который мы хотели бы прочитать, с необязательной кодировкой
. Мы будем использовать синтаксис try-with-resources для автоматизации очистки и закрытия:
Path path = Paths.get("input.txt"); try (Streamstream = Files.lines(path, StandardCharsets.UTF_8)) { stream.forEach(System.out::println); } catch (IOException ex) { // Handle exception }
Поскольку метод возвращает Поток
, мы используем его для каждого() метода для перебора строк со ссылкой на метод для краткости.
Вместо печати каждой строки для добавления строк можно использовать StringBuilder
:
Path path = Paths.get("input.txt"); StringBuilder sb = new StringBuilder(); try (Streamstream = Files.lines(path)) { stream.forEach(s -> sb.append(s).append("\n")); } catch (IOException ex) { // Handle exception } String contents = sb.toString();
С помощью StringBuilder
весь файл может быть представлен в одной Строке
(переменная содержимое
выше). Перед выполнением таких итераций важно учитывать длину входного файла.
Если файл не слишком велик, можно поместить его в строку, хотя, если он размером в сотни мегабайт, это не так мудро.
Файлы.Строка чтения()
Начиная с Java 11, класс Files
познакомил нас с методом ReadString ()
, который принимает Путь
к файлу, а также Кодировку
.
В отличие от Files.lines()
, он возвращает Строку
напрямую, а не Поток
объект:
Path path = Paths.get("input.txt"); String contents = null; try { contents = Files.readString(path, StandardCharsets.ISO_8859_1); } catch (IOException ex) { // Handle exception }
Файлы.ReadAllBytes()
Более низкоуровневым подходом к чтению является метод Files.ReadAllBytes ()
, который возвращает байт[]
. Разработчик должен использовать эти байты – преобразовать их в строку, обработать их такими, какие они есть, и т.д.
Этот метод также принимает Путь
к файлу, который мы хотели бы прочитать:
Path path = Paths.get("input.txt"); byte[] bytes = null; try { bytes = Files.readAllBytes(path); } catch (IOException ex) { // Handle exception }
Теперь массив байт
содержит всю информацию из input.txt
файл. Самый простой способ преобразовать его в строку-поместить их в конструктор с необязательной кодировкой
:
String str = new String(bytes, StandardCharsets.UTF_8);
Примечание: Такие решения, как чтение всех байтов, подходят только в тех случаях, когда мы имеем дело с файлами небольших размеров. Это не способствует повышению производительности, и нет особого смысла хранить большие файлы в памяти программы.
Сканер
Сканер
– это особенно полезный класс для чтения содержимого из потоков. Поскольку он работает с абстрактными потоками, его также можно использовать для чтения строк. Сканер
работает, разбивая входные данные на токены, которые последовательно извлекаются из входного потока.
Поскольку мы работаем со строками, мы хотели бы использовать методы, возвращающие строки. Сканер
имеет next()
и nextLine()
именно для этого. Оба метода возвращают объекты типа String
. Первый используется для чтения произвольных строк, в то время как второй анализирует и возвращает целые строки.
Если каждая строка содержит нужное количество данных, то следующая строка()
является идеальным выбором. Если в файле есть важная информация, которая разбита на более мелкие фрагменты, но не обязательно на строки (или файл содержит, скажем, одну строку), то next()
может быть лучшим вариантом.
Конструктор сканера
принимает множество объектов – Путь
s, Входной поток
s, Файл
s и т. Д. Мы будем использовать Файл
:
File file = new File("input.txt"); Scanner sc = new Scanner(file); while(sc.hasNext()) { System.out.println(sc.next()); }
Мы используем цикл while
до тех пор, пока sc
содержит больше элементов. Если бы мы не проверили с помощью hasNext()
, sc
выдал бы Исключение NoSuchElementException
, если мы попытаемся получить доступ к элементу после последнего.
Идея использования методов hasNext()
и next()
исходит из интерфейса Итератора , поскольку Сканер
реализует его внутренне.
Устройство для чтения файлов
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Файл FileReader
используется для чтения файлов. Он предлагает методы read()
и read(char [])
, которые возвращают один символ и несколько символов соответственно. Кроме того, он принимает Файл
или Строку
в конструктор.
Считыватель файлов.чтение(символ[])
Давайте откроем файл с помощью FileReader
и прочитаем его содержимое:
FileReader in = new FileReader("input.txt"); char[] chars = new char[256]; int n = in.read(chars, 0, chars.length); String contents = new String(chars);
Метод read()
принимает последовательность символов (в которой мы храним прочитанные символы), начальную и конечную точки того, что мы хотели бы прочитать. В частности, мы решили прочитать не более 256 символов. Если input.txt
имеет больше, мы будем читать только 256 символов. Если в нем меньше, возвращаются читаемые символы.
Возвращаемое значение, хранящееся внутри целого числа n
, может быть использовано для проверки того, сколько символов метод на самом деле прочитал. В случае, если достигнут конец потока, метод возвращает -1
.
Поскольку метод заполняет символ[]
, мы можем преобразовать его в Строку
. Аналогичный результат можно получить с помощью String.valueOf(char[])
.
Читатель файлов.чтение()
Метод read()
без char[]
считывает по одному символу за раз. Мы захотим просмотреть содержимое и прочитать каждый символ самостоятельно:
FileReader in = new FileReader("input.txt"); StringBuilder sb = new StringBuilder(); while(in.read() != -1) { sb.append(in.read()); } String contents = sb.toString(); in.close();
Здесь мы проверяем, не является ли прочитанный символ -1
, что указывало на то, что для чтения больше не осталось символов. Если нет, мы добавим()
его в StringBuilder
и, наконец, преобразуем его в Строку
.
Примечание: Оба read()
и read(char[])
считанные байты, преобразуйте их в символы и возвращайте их по одному . Это неэффективно и должно выполняться с помощью буферизации , когда это возможно.
Буферизатор
BufferedReader
-это объект, предназначенный для чтения текста из потока ввода символов. Он буферизован, что означает, что он использует внутренний буфер для временного хранения. Как мы видели в предыдущем разделе, “обычное” Считывающее
сканирование иногда бывает неэффективным.
Рекомендуется обернуть любой потенциально дорогостоящий считыватель
в BufferedReader
для повышения производительности, поскольку буферизация символов обеспечивает более эффективное чтение входного текста.
Давайте создадим экземпляр BufferedReader
:
BufferedReader in = new BufferedReader(new FileReader("input.txt"));
На данный момент у нас есть объект bufferedreader, готовый для чтения содержимого из input.txt
. В этом примере мы будем читать файл построчно, хотя BufferedReader
поддерживает чтение отдельных символов по отдельности, а также нескольких символов в массив.
Давайте используем этот экземпляр BufferedReader
для чтения файла и сохранения его содержимого, строка за строкой, в строку:
StringBuilder sb = new StringBuilder(); while(in.readLine != null) { sb.append(in.readLine()).append("\n"); } String contents = sb.toString(); in.close();
Еще раз, мы используем StringBuilder
для сбора всех строк. Чтобы разделить каждую строку, мы добавляем нулевой терминатор ( \n
) между ними. Наконец, мы закрываем ручей.
Вывод
В этой статье мы рассмотрели некоторые распространенные методы чтения файлов в строки на Java. Существует множество вариантов, но большинство из них имеют схожий основной принцип: укажите путь к файлу, прочитайте содержимое в структуру данных (например, char[]
или строку); затем выполните некоторую окончательную обработку, чтобы собрать все содержимое файла соответствующим образом.
Мы рассмотрели метод File.lines ()
, метод Files.ReadString ()
, метод Files.ReadAllBytes ()
, а также классы Scanner
, FileReader
и BufferedReader|/.