И опять здравствуйте. В прошлый раз мы с вами говорили о разборе информации, поступающей в виде строк, и о вводе с консоли. Сегодня мы разовьем эту тему и поговорим о работе с файлами. Программы довольно часто хранят в файлах разную настроечную информацию, а некоторые программы специально ориентированы на обработку файлов. Они читают содержимое файла, обрабатывают его и записывают результат работы в другой файл. Например, так работают многие утилиты командной строки в операционных системах Windows и Linux. В качестве примера мы рассмотрим задачу на выравнивание текста в файле. Итак, пусть входной файл с именем, заданным параметром inputName, содержит некоторый текст на русском или английском языке. Наша задача — прочитать этот текст и вывести его в выходной файл, выравняв текст по левому краю, то есть добившись, чтобы все строки нового файла начинались с какого-либо слова, но не с пробела или знака препинания. Также нам следует добиться, чтобы длина каждой строки в выходном файле не превосходила особого значения, которое передается нам через параметр функции LineLength. Пустые строки, если они есть во входном файле, следует сохранить и в выходном файле. Для работы с файлами язык Kotlin использует ряд типов и функций из библиотеки языка Java, дополняя их своими возможностями. Для представления файла используется тип File из пакета java.io, что расшифровывается, как input/output. Обычно переменная типа File соответствует реальному файлу, находящемуся на диске компьютера. Для создания переменной типа File используется специальная функция-конструктор. Ее специфика заключается в том, что ее имя совпадает с именем типа (File), а ее результат — это сконструированный файл. В качестве параметра в функцию передается путь к файлу или имя файла, если файл должен находиться в текущей директории. С файлом можно работать в режиме чтения или в режиме записи. В режиме чтения файл обязан уже существовать на диске. Для того, чтобы прочитать информацию из файла, есть несколько способов. Самый простой из них — вызвать на файле функцию readLines. Ее результат — это список из всех строк, имеющихся в файле. Запись в файл делается немного иным образом. Для записи нужно создать так называемого писателя, вызвав на файле функцию BufferedWriter. Это действие приведет к созданию файла на диске, если ранее он не существовал. Если же такой файл уже был, то он будет уничтожен и заменен новым, пока пустым. Писатель, в свою очередь, имеет ряд функций для записи в файл. Нам с вами понадобится функция write для добавления в файл очередной строки и функция newLine для вставки в файл переноса на новую строку. Теперь попробуем собрать все вместе. Нам с вами потребуется переменная, хранящая длину текущей строки в выходном файле. Она складывается из длины всех слов и пробелов, которые уже были добавлены в эту строку. Когда мы делаем перенос на новую строку, длина текущей строки сбрасывается в 0. Также нам потребуется научиться разбивать строки входного файла на отдельные слова. В этой задаче мы будем считать словом любую последовательность символов, не содержащую пробел. Для разбиения применим функцию split. Обрабатывая очередное слово, мы добавляем его в текущую строку, если оно туда помещается. Длина текущей строки с учетом пробела и данного слова не превосходит заданного ограничения LineLength. Иначе мы добавляем его на новую строку. Особым случаем является пустая строка во входном файле. Ее следует сохранить и в выходном файле. Поэтому, если мы находимся в начале очередной строки выходного файла, и она еще пуста, нам достаточно вставить один перевод строки, чтобы получить пустую строку. Если же очередная строка не пуста, требуется вставить один перевод, чтобы ее закончить, и еще один, чтобы получить пустую строку. В конце работы с файлом писателя обязательно нужно закрыть, вызвав на нем функцию close. Это заканчивает работу с файлом и фиксирует его состояние на диске. Обратите внимание, как устроен тест для этой задачи. Мы используем заранее подготовленный файл align_in1.txt, лежащий в директории обучающего проекта input. Выходным файлом является временный temp.txt, который удаляется по окончании теста. В тесте его содержимое сравнивается с приготовленным заранее. Выполните хотя бы два упражнения к этому уроку. Интересным развитием задачи, рассмотренной нами в примере, является alignFileByWidth, где строки выравниваются не по левому краю, а по ширине. Комплексной задачей на почти все содержимое курса является задача countSubstrings на подсчет числа вхождений различных строк в файл. Вы можете решать и другие задачи к данному уроку. Если вы справились с этими упражнениями, основная часть курса для вас закончена. Поздравляю вас! Если вас интересует получение сертификата, откройте файл chapter07 из директории tutorial учебного проекта и прочитайте его последний раздел.