В этой статье будет рассмотрено, как вы можете создать, открыть файл, прочитать его содержимое и записать в него в Rust.
Как инженер-программист или кто-то, кто интересуется технологиями, операции чтения и записи (также известные как ввод-вывод для ввода и вывода) являются некоторыми важными понятиями, которые вы должны знать.
Прочитав эту статью, вы сможете создать, открыть файл, прочитать его содержимое и добавить в него содержимое. Итак, давайте погрузимся.
Но сначала давайте заложим важную основу, рассмотрев, как персонажи представлены в Rust.
String и str (отрезки строки)
Я знаю, что это название (☝🏿) кажется немного запутанным… в Rust у нас есть два типа для представления строк:
str
: срез строки, единственный строковый тип основного языка программирования Rust. Этот тип статичен и неизменен, и мы обычно видим его в заимствованной форме:&str
.String
: это второй строковый тип, доступный в Rust благодаря стандартной библиотеке. Этот тип более гибкий, так как им можно владеть и он может изменяться.
Оба типа строк имеют кодировку UTF-8 (подробнее об этом здесь); String
используется, когда вам нужно владеть строкой или изменить ее, а &str
— когда вы хотите визуализировать строку.
Стандартная библиотека Rust позволяет нам выполнять разнообразные операции с файлами благодаря потрясающей структуре File
и связанным с ней методам. Мы собираемся использовать его в оставшейся части этой статьи.
Теперь у нас все готово, так что давайте сразу к делу!!
Как вы создаете файл?
Чтобы создать файл, мы будем использовать create
, метод структуры File
, как показано в следующем примере:
Метод create
возвращает Result
, так как мы можем успешно создать файл или у нас может быть ошибка (диск весь, нет привилегий и т. д., выберите свой яд 💀).
Result
— это перечисление, также предоставляемое стандартной библиотекой Rust, позволяющее нам управлять ошибками (подробнее здесь).
Как открыть файл?
Чтобы открыть файл, мы собираемся использовать метод open
структуры File
, который также возвращает Result
.
Здесь open
попытается найти файл на корневом уровне нашего проекта Rust. Если файл не существует, он будет создан.
Я рекомендую вам запустить наш последний пример с существующим и несуществующим файлом, чтобы увидеть результаты.
Как вы читаете содержимое файла?
Простой способ прочитать содержимое файла — открыть его и прочитать его содержимое как String
(теперь вы понимаете, почему в этом первом разделе мы представили строковые типы).
Как видите, мы создаем изменяемую переменную String
с именем contents
и обновляем ее, передавая содержимое файла в строке 7 с помощью метода read_to_string()
. Я рекомендую вам проверить метод read
, который позволяет получить содержимое файла в виде вектора байтов (подробнее об этом здесь).
Я предпочитаю читать содержимое файла, используя структуру BufReader<R>
, так как она более эффективна и оптимальна. Фокус в том, что Bufreader
обеспечивает компонент буферизации при чтении из файла (подробнее об этом здесь).
Как видите, мы начали наш пример с открытия файла, как мы узнали ранее. Затем в строке 6 мы создаем переменную reader
; BufReader
в файле, который мы только что открыли. Затем мы будем использовать этот reader
для извлечения содержимого файла (строка 8).
Как добавить содержимое в файл?
Добавление содержимого — непростая задача, поскольку нам может понадобиться добавить некоторое содержимое в новый файл, перегрузить содержимое существующего файла или, возможно, добавить некоторое содержимое в существующий файл.
То, что несколько секунд назад казалось тривиальным, теперь кажется более сложным… добро пожаловать (назад) в красоту разработки программного обеспечения.
Итак, давайте начнем с первых двух случаев; В следующем примере показано, как добавить содержимое во вновь созданный файл или открыть существующий и переопределить его содержимое.
В нашем примере, если файл missy.txt
не существует, мы создадим его перед добавлением нашего контента. Если файл существует, наш новый контент заменит его содержимое.
Да, мы снова используем create
. create
позволяют нам создавать файлы и открывать существующие в режиме только для записи.
Использование create
для существующих файлов действительно работает, но если мы хотим быть более точными, мы должны использовать structOpenOptions
, чтобы определить, как осуществляется доступ к файлу.
В этом примере мы открываем существующий файл и в начале добавляем некоторый контент. Если в файле есть какой-то контент, наш новый контент будет добавлен в начале, заменив только необходимое количество данных (здесь будьте осторожны; мы устанавливаем для параметра append
значение false
в строке 9).
В последнем примере ниже мы добавим некоторый контент в файл, добавив его в конец любых существующих данных. См. здесь параметр append
для true
в строке 9.
Как и процесс записи, в Rust есть структура BufWriter
, которая обеспечивает оптимальный способ записи в поток.
Заключить
Я надеюсь, что смог дать вам прочную основу для выполнения некоторых файловых операций ввода-вывода в Rust. Это только начало. Я рекомендую вам изучить документацию по структуре File
, а затем углубиться в BufReader
и BufWriter
.