Ruby Файловый ввод и вывод
Ruby предоставляет полный набор методов, связанных с вводом-выводом, реализованных в модуле Kernel. Все методы ввода-вывода являются производными от класса IO.
КлассIOПредоставляет все основные методы, такие какread, write, gets, puts, readline, getcиprintf。
В этой главе объясняются все основные функции ввода-вывода, доступные в Ruby. Для получения дополнительных функций, пожалуйста, обратитесь кIO-классу Ruby.
putsОператор
В предыдущих главах вы присваивали значения переменным, а затем использовалиputsоператор для вывода результата.
putsОператор указывает программе отобразить значение, хранящееся в переменной. Это добавляет символ новой строки в конце каждой строки.
Пример
Вывод приведенного выше примера:
This is variable one This is variable two
getsОператор
getsОператор можно использовать для получения пользовательского ввода из стандартного ввода с именем STDIN.
Пример
Следующий код демонстрирует, как использовать оператор gets. Этот код предлагает пользователю ввести значение, это значение будет сохранено в переменной val и в итоге выведено в STDOUT.
Пример
Вывод приведенного выше примера:
Enter a value : This is entered value This is entered value
putcОператор
иputsВ отличие от оператора,putsоператор выводит всю строку на экран, тогда какputcинструкцию можно использовать для вывода одного символа за раз.
Пример
Вывод следующего кода — просто символ H:
Пример
Вывод приведенного выше примера:
H
printStatement
printпохож на операторputs. Единственное отличие состоит в том, что операторputsпереходит на следующую строку после вывода содержимого, тогда как при использованииprint, курсор находится на той же строке.
Пример
Вывод приведенного выше примера:
Hello WorldGood Morning
Открытие и закрытие файлов
До сих пор вы читали из стандартного ввода и записывали в стандартный вывод. Теперь мы увидим, как работать с реальными файлами данных.
File.newМетод
Вы можете использовать методFile.new, чтобы создать объектFileдля чтения, записи или того и другого, в зависимости от параметра mode. Наконец, вы можете использоватьFile.closeметод для закрытия файла.
Синтаксис
File.openМетод
Вы можете использовать методFile.open, чтобы создать новый объект файла и присвоить этот объект файла файлу. Однако,File.openиFile.newесть небольшое различие между методами. Различие состоит в том, чтоFile.openэтот метод может быть связан с блоком, тогда какFile.newэтот метод не может.
В следующей таблице перечислены различные режимы открытия файлов:
| Mode | Описание |
|---|---|
| r | Режим только для чтения. Указатель файла помещается в начало файла. Это режим по умолчанию. |
| r+ | Режим чтения-записи. Указатель файла помещается в начало файла. |
| w | Режим только для записи. Если файл существует, он перезаписывает файл. Если файл не существует, создается новый файл для записи. |
| w+ | Режим чтения-записи. Если файл существует, он перезаписывает существующий файл. Если файл не существует, создается новый файл для чтения и записи. |
| a | Режим только для записи. Если файл существует, указатель файла помещается в конец файла. То есть файл находится в режиме добавления. Если файл не существует, создается новый файл для записи. |
| a+ | Режим чтения и записи. Если файл существует, указатель файла помещается в конец файла. То есть файл находится в режиме добавления. Если файл не существует, создается новый файл для чтения и записи. |
Чтение и запись файлов
Методы, используемые для простого ввода-вывода, также можно использовать со всеми файловыми объектами. Так, gets читает строку из стандартного ввода,aFile.getsи читает строку из файлового объекта aFile.
Однако объекты ввода-вывода предоставляют дополнительные настройки для методов доступа, что дает нам удобство.
sysreadМетод
Вы можете использовать методsysreadдля чтения содержимого файла. При использовании метода sysread вы можете открыть файл в любом режиме. Например:
Ниже приведен входной текстовый файл:
This is a simple text file for testing purpose.
Теперь попробуем прочитать этот файл:
Пример
Эта инструкция читает первые 20 символов входного файла. Указатель файла будет установлен на позицию 21-го символа в файле.
syswriteМетод
Вы можете использовать методsyswriteдля записи содержимого в файл. При использовании метода syswrite необходимо открыть файл в режиме записи. Например:
Пример
Эта инструкция запишет "ABCDEF" в файл.
each_byteМетод
Этот метод принадлежит классуFile. Методeach_byteявляется итератором, который перебирает каждый символ в строке. Посмотрите следующий пример кода:
Пример
Символы по одному передаются в переменную ch, а затем отображаются на экране, как показано ниже:
A.B.C.D.E.F.s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
IO.readlinesМетод
КлассFileявляется подклассом класса IO. Класс IO также имеет некоторые методы для манипулирования файлами.
IO.readlinesявляется методом в классе IO. Этот метод возвращает содержимое файла построчно. Следующий код показывает использование методаIO.readlines:
Пример
В этом коде переменная arr является массивом. Файлinput.txtсодержит каждую строку как элемент массива arr. Следовательно, arr
IO.foreachМетод
Этот метод также возвращает вывод построчно. Методforeachи методreadlinesотличаются тем, что методforeachсвязан с блоком. Однако, в отличие от методаreadlines, методforeachне возвращает массив. Например:
Пример
Этот код передаст содержимое файлаtestпострочно переменной block, и затем вывод будет отображён на экране.
Переименование и удаление файлов
Вы можете использовать методыrenameиdeleteдля переименования и удаления файлов.
В следующем примере переименовывается существующий файлtest1.txt:
Пример
В следующем примере удаляется существующий файлtest2.txt:
Пример
Режимы файлов и владение
Использование методаchmodс маской для изменения режима или списка разрешений/доступа к файлу:
В следующем примере изменяется режим существующего файлаtest.txtна значение маски:
Пример
В следующей таблице перечисленыchmodразличные маски, которые можно использовать в этом методе:
| Маска | Описание |
|---|---|
| 0700 | маска rwx для владельца |
| 0400 | r, для владельца |
| 0200 | w, для владельца |
| 0100 | x, для владельца |
| 0070 | маска rwx для группы |
| 0040 | r, для группы |
| 0020 | w, для группы |
| 0010 | x, для группы |
| 0007 | маска rwx для остальных |
| 0004 | r, для остальных |
| 0002 | w, для остальных |
| 0001 | x, для остальных |
| 4000 | Установить идентификатор пользователя при выполнении |
| 2000 | Установить идентификатор группы при выполнении |
| 1000 | Сохранять выгруженный текст, даже после использования |
Запросы к файлам
Следующая команда проверяет, существует ли файл перед открытием файла:
Пример
Следующая команда проверяет, действительно ли файл является файлом:
Пример
Следующая команда проверяет, является ли заданное имя файла каталогом:
Пример
Следующая команда проверяет, является ли файл читаемым, записываемым и исполняемым:
Пример
Следующая команда проверяет, равен ли размер файла нулю:
Пример
Следующая команда возвращает размер файла:
Пример
Следующая команда используется для проверки типа файла:
Пример
Метод ftype определяет тип файла, возвращая одно из следующих значений:file, directory, characterSpecial, blockSpecial, fifo, link, socket или unknown。
Следующая команда используется для проверки времени создания, изменения или последнего доступа к файлу:
Пример
Каталоги в Ruby
Все файлы содержатся в каталогах, и Ruby предоставляет способы обработки файлов и каталогов.FileКласс File используется для обработки файлов,Dirа класс Dir используется для обработки каталогов.
Просмотр каталогов
Чтобы изменить каталог в программе Ruby, используйтеDir.chdir. Следующий пример изменяет текущий каталог на/usr/bin。
Вы можете использовать Dir.pwdдля просмотра текущего каталога:
Вы можете использоватьDir.entriesчтобы получить список файлов и каталогов в указанном каталоге:
Dir.entriesВозвращает массив, содержащий все элементы в указанном каталоге.Dir.foreachПредоставляет ту же функциональность:
Более краткий способ получить список каталога — использовать методы Dir, подобные массивам:
Создание каталогов
Dir.mkdirМожно использовать для создания каталогов:
Вы также можете задать права доступа для нового каталога (не для существующего каталога) с помощью mkdir:
Примечание:Маска 755 задаёт права для владельца, группы и остальных (любого) как rwxr-xr-x, где r = чтение, w = запись, x = выполнение.
Удаление каталогов
Dir.deleteМожно использовать для удаления каталога.Dir.unlinkиDir.rmdirВыполняют ту же функцию, обеспечивая удобство.
Создание файлов и временных каталогов
Временные файлы — это информация, которая просто создаётся во время выполнения программы, но не сохраняется постоянно.
Dir.tmpdirпредоставляет путь к временному каталогу в текущей системе, но этот метод недоступен по умолчанию. Чтобы сделатьDir.tmpdirдоступным, необходимо require 'tmpdir'.
Вы можете использоватьDir.tmpdirиFile.joinвместе, чтобы создать временный файл, не зависящий от платформы:
Этот код создаёт временный файл, записывает в него данные, а затем удаляет файл. Стандартная библиотека Ruby также включает библиотеку под названиемTempfileбиблиотека, которую можно использовать для создания временных файлов:
Встроенные функции
Ниже приведён полный список встроенных функций для работы с файлами и каталогами в Ruby:
Другие расширения