Васильев Андрей Михайлович, 2024
Версии презентации
ФС — это подсистема ядра ОС, обеспечивающая общий и регулируемый доступ к данным на энергонезависимых источниках: жёстких дисках, оптических дисках, твердотельных носителях и т.д.
На физическом уровне каждый такой носитель представляет собой последовательность из блоков одинакового размера
Для процессов и конечного пользователя была предложена древовидная структура
В задачу ОС входит преобразования логического обращения к дереву файловой системы на обращение к последовательности блоков
Приложение взаимодействует с ФС путём отправки системных вызовов
Рассмотрим ряд системных вызовов POSIX
open
— открыть файл для взаимодействия, получить файловый дескрипторread
— прочитать данные из файлового дескриптораwrite
— записать данные в файловый дескрипторopendir
— открыть каталог для чтения содержимогоreaddir
— считать информацию о файлах в каталогеДанные вызовы сформированы на языке Си
Для удобства построения путей к нужным файлам была введена концепция текущего рабочего каталога
Без её помощи можно стоить пути только абсолютно, начиная с корневого каталога
/
/home/user/my-data/marks.ods
Это соответствует следующей структуре каталогов
/
└── home
└── user
└── my-data
└── marks.ods
С помощью рабочего каталога можно сократить вводимый пользователем путь:
marks.ods
Эти пути будут указывать на один и тот же файл, если текущий рабочий каталог
/home/user/my-data/
Путь к файлу = текущий рабочий каталог + относительный путь
/home/user/my-data/ + marks.ods = /home/user/my-data/marks.ods
Относительные пути значительно сокращают скорость работы с нужными файлами, если их правильно применять
Согласно древовидному представлению мы можем двигаться в трёх направлениях:
Для движения «вверх» необходимо использовать специальный путь: ..
Например для составления пути к файлу data.txt
в родительском каталоге необходимо составить относительный путь ../data.txt
Родительский каталог/
├── Рабочий каталог/
│ ├── cute-animals/
│ │ └── cat.png
│ └── picture.png
└── data.txt
Для указания текущего каталога используется специальное название: .
Для указания пути к файлу picture.png
в текущем каталоге следующие формы будут одинаковыми:
./picture.png
picture.png
Родительский каталог/
├── Рабочий каталог/
│ ├── cute-animals/
│ │ └── cat.png
│ └── picture.png
└── data.txt
Для указания пути к файлу cat.png
, расположенному в подкаталоге cute-animals
необходимо сформировать: cute-animals/cat.png
Родительский каталог/
├── Рабочий каталог/
│ ├── cute-animals/
│ │ └── cat.png
│ └── picture.png
└── data.txt
При запуске задачи типа javaExec
Gradle установит в качестве рабочего каталога
каталог проекта, т.е. каталог с файлом build.gradle.kts
Рассмотрим следующую структуру каталогов:
project
├── gradle/
├── gradlew
├── gradlew.bat
├── data/
│ └── content.txt
├── settings.gradle(.kts)
├── subproject-a/
│ ├── build.gradle(.kts)
│ └── src/
└── subproject-b/
├── build.gradle(.kts)
└── src
Если будет запущена команда по сборке, описанная в файле
subproject-a/build.gradle.kts
, то рабочим каталогом будет каталог
subproject-a
Для доступа к данным, data/content.txt
, внутри такого процесса необходимо
сформировать путь ../data/content.txt
Если путь получен от пользователя приложения, то приложению не надо вносить в него изменения
На платформе JVM приложению на языке Kotlin доступны все классы Java плюс ряд функций-расширений, которые упрощают работу с первыми
java.nio.Path
предоставляет средства для формирования путей
of
resolve
и
resolveSibling
java.io.File
предоставляет средства для анализа состояния файлов на файловой
системеjava.io.FileReader
позволяет считывать текстовую информацию из файлаДля облегчения задач считывания и записи файлов Kotlin предоставляет
File.readText()
— считывает всё содержимое файла и возвращает строкуFile.writeText()
— записывает переданную строку как текст всего файлаFile.appendText()
— записывает переданную строку какПри работе на платформе JVM внутри приложения строки хранятся в кодировке Unicode
При получении текстовых данных из внешних источников JVM необходимо выполнить преобразование данных в Unicode
При сдаче лабораторной работы внешнее по отношению к приложению окружение будет использовать Unicode, как и в компьютерной аудитории