Возможно, все это показалось вам хаотичным нагромождением разнородных фактов; если так, вы абсолютно правы!.. Отчасти сложность проистекает из самой природы ввода/вывода, отчасти это результат компромиссов, принятых при проектировании, а отчасти следствие наследия прошлых лет, устоявшихся традиций и особенностей различных языков и операционных систем.
Ввод/вывод в Ruby сложен, потому что он сложен в принципе. Но мы старались описать его как можно понятнее и показать, где и когда стоит применять различные приемы.
В основе системы ввода/вывода в Ruby лежит класс IO
, который определяет поведение всех операций ввода/вывода. С ним тесно связан (и наследует ему) класс File
. В класс File
вложен класс Stat
, инкапсулирующий различные сведения о файле (например, разрешения и временные штампы). Методы stat
и lstat
возвращают объекты типа File::Stat
.
В модуле FileTest
также есть методы, позволяющие опрашивать практически те же свойства. Он подмешивается к классу File
, но может использоваться и самостоятельно.
Наконец, методы ввода/вывода есть и в модуле Kernel
, который подмешивается к классу Object
(предку всех объектов, включая и классы). Это простые процедуры, которыми мы пользовались на протяжении всей книги, не думая о том, от имени какого объекта они вызываются. По умолчанию они настроены на стандартный ввод и стандартный вывод.
Поначалу может показаться, что это хаотическое хитросплетение перекрывающейся функциональности. Но в каждый момент времени вам необходима лишь небольшая часть всего каркаса.
На более высоком уровне Ruby предлагает механизмы, позволяющие сделать объекты устойчивыми. Метод Marshal
реализует простую сериализацию объектов; он лежит в основе более изощренной библиотеки PStore
. Мы включили в эту главу и библиотеку DBM, хотя она умеет работать только со строками.
На самом высоком уровне возможен интерфейс с системами управления базами данных, например MySQL или Oracle. Эта тема настолько сложна, что ей можно было бы посвятить одну или даже несколько книг. Мы ограничимся лишь кратким введением. В некоторых случаях будут даны ссылки на архивы в сети.
Под файлом мы обычно, хотя и не всегда, понимаем файл на диске. Концепция файла в Ruby, как и в других языках, — это полезная абстракция. Говоря «каталог», мы подразумеваем каталог или папку в смысле, принятом в UNIX и Windows.
Класс File
тесно связан с классом IO
, которому наследует. Класс Dir
связан с ним не так тесно, но мы решили рассмотреть файлы и каталоги вместе, поскольку между ними имеется концептуальная связь.
10.1.1.Открытие и закрытие файлов
Метод класса File.new
, создающий новый объект File
, также открывает файл. Первым параметром, естественно, является имя файла.
Необязательный второй параметр называется строкой указания режимам он говорит, как нужно открывать файл — для чтения, для записи и т.д. (Строка указания режима не имеет ничего общего с разрешениями.) По умолчанию предполагается режим "r"
, то есть только чтение. Ниже показано, как открывать файлы для чтения и записи.
file1 = File.new("one") # Открыть для чтения.
file2 = File.new("two", "w") # Открыть для записи.
Есть также разновидность метода new, принимающая три параметра. В этом случае второй параметр задает начальные разрешения для файла (обычно записывается в виде восьмеричной константы), а третий представляет собой набор флагов, объединенных союзом ИЛИ. Флаги обозначаются константами, например: File::CREAT
(создать файл, если он еще не существует) и File::RDONLY
(открыть только для чтения). Такая форма используется редко.
file = File.new("three", 0755, File::CREAT|File::WRONLY)
В виде любезности по отношению к операционной системе и среде исполнения всегда закрывайте открытые вами файлы. Если файл был открыт для записи, то это не просто вежливость, а способ предотвратить потерю данных. Для закрытия файла предназначен метод close
:
out = File.new("captains.log", "w")
# Обработка файла...
out.close
Имеется также метод open
. В простейшей форме это синоним new
:
trans = File.open("transactions","w")
Но методу open
можно также передать блок, и это более интересно. Если блок задан, то ему в качестве параметра передается открытый файл. Файл остается открытым на протяжении всего времени нахождения в блоке и автоматически закрывается при выходе из него. Пример:
Читать дальше
Конец ознакомительного отрывка
Купить книгу