Ruby Файловый ввод и вывод

Ruby предоставляет полный набор методов, связанных с вводом-выводом, реализованных в модуле Kernel. Все методы ввода-вывода являются производными от класса IO.

КлассIOПредоставляет все основные методы, такие какread, write, gets, puts, readline, getcиprintf。

В этой главе объясняются все основные функции ввода-вывода, доступные в Ruby. Для получения дополнительных функций, пожалуйста, обратитесь кIO-классу Ruby.

putsОператор

В предыдущих главах вы присваивали значения переменным, а затем использовалиputsоператор для вывода результата.

putsОператор указывает программе отобразить значение, хранящееся в переменной. Это добавляет символ новой строки в конце каждой строки.

Пример

#!/usr/bin/ruby val1 = "Это переменная один" val2 = "Это переменная два" puts val1 puts val2

Вывод приведенного выше примера:

This is variable one
This is variable two

getsОператор

getsОператор можно использовать для получения пользовательского ввода из стандартного ввода с именем STDIN.

Пример

Следующий код демонстрирует, как использовать оператор gets. Этот код предлагает пользователю ввести значение, это значение будет сохранено в переменной val и в итоге выведено в STDOUT.

Пример

#!/usr/bin/ruby puts "Введите значение :" val = gets puts val

Вывод приведенного выше примера:

Enter a value :
This is entered value
This is entered value

putcОператор

иputsВ отличие от оператора,putsоператор выводит всю строку на экран, тогда какputcинструкцию можно использовать для вывода одного символа за раз.

Пример

Вывод следующего кода — просто символ H:

Пример

#!/usr/bin/ruby str="Hello Ruby!" putc str

Вывод приведенного выше примера:

H

printStatement

printпохож на операторputs. Единственное отличие состоит в том, что операторputsпереходит на следующую строку после вывода содержимого, тогда как при использованииprint, курсор находится на той же строке.

Пример

#!/usr/bin/ruby print "Hello World" print "Доброе утро"

Вывод приведенного выше примера:

Hello WorldGood Morning

Открытие и закрытие файлов

До сих пор вы читали из стандартного ввода и записывали в стандартный вывод. Теперь мы увидим, как работать с реальными файлами данных.

File.newМетод

Вы можете использовать методFile.new, чтобы создать объектFileдля чтения, записи или того и другого, в зависимости от параметра mode. Наконец, вы можете использоватьFile.closeметод для закрытия файла.

Синтаксис

aFile = File.new("filename", "mode") #... обработать файл aFile.close

File.openМетод

Вы можете использовать методFile.open, чтобы создать новый объект файла и присвоить этот объект файла файлу. Однако,File.openиFile.newесть небольшое различие между методами. Различие состоит в том, чтоFile.openэтот метод может быть связан с блоком, тогда какFile.newэтот метод не может.

File.open("filename", "mode") do |aFile| # ... обработать файл end

В следующей таблице перечислены различные режимы открытия файлов:

ModeОписание
rРежим только для чтения. Указатель файла помещается в начало файла. Это режим по умолчанию.
r+Режим чтения-записи. Указатель файла помещается в начало файла.
wРежим только для записи. Если файл существует, он перезаписывает файл. Если файл не существует, создается новый файл для записи.
w+Режим чтения-записи. Если файл существует, он перезаписывает существующий файл. Если файл не существует, создается новый файл для чтения и записи.
aРежим только для записи. Если файл существует, указатель файла помещается в конец файла. То есть файл находится в режиме добавления. Если файл не существует, создается новый файл для записи.
a+Режим чтения и записи. Если файл существует, указатель файла помещается в конец файла. То есть файл находится в режиме добавления. Если файл не существует, создается новый файл для чтения и записи.

Чтение и запись файлов

Методы, используемые для простого ввода-вывода, также можно использовать со всеми файловыми объектами. Так, gets читает строку из стандартного ввода,aFile.getsи читает строку из файлового объекта aFile.

Однако объекты ввода-вывода предоставляют дополнительные настройки для методов доступа, что дает нам удобство.

sysreadМетод

Вы можете использовать методsysreadдля чтения содержимого файла. При использовании метода sysread вы можете открыть файл в любом режиме. Например:

Ниже приведен входной текстовый файл:

This is a simple text file for testing purpose.

Теперь попробуем прочитать этот файл:

Пример

#!/usr/bin/ruby aFile = File.new("input.txt", "r") if aFile content = aFile.sysread(20) puts content else puts "Не удалось открыть файл!" end

Эта инструкция читает первые 20 символов входного файла. Указатель файла будет установлен на позицию 21-го символа в файле.

syswriteМетод

Вы можете использовать методsyswriteдля записи содержимого в файл. При использовании метода syswrite необходимо открыть файл в режиме записи. Например:

Пример

#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Не удалось открыть файл!" end

Эта инструкция запишет "ABCDEF" в файл.

each_byteМетод

Этот метод принадлежит классуFile. Методeach_byteявляется итератором, который перебирает каждый символ в строке. Посмотрите следующий пример кода:

Пример

#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") aFile.rewind aFile.each_byte {|ch| putc ch; putc ?. } else puts "Не удалось открыть файл!" end

Символы по одному передаются в переменную 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:

Пример

#!/usr/bin/ruby arr = IO.readlines("input.txt") puts arr[0] puts arr[1]

В этом коде переменная arr является массивом. Файлinput.txtсодержит каждую строку как элемент массива arr. Следовательно, arr

IO.foreachМетод

Этот метод также возвращает вывод построчно. Методforeachи методreadlinesотличаются тем, что методforeachсвязан с блоком. Однако, в отличие от методаreadlines, методforeachне возвращает массив. Например:

Пример

#!/usr/bin/ruby IO.foreach("input.txt"){|block| puts block}

Этот код передаст содержимое файлаtestпострочно переменной block, и затем вывод будет отображён на экране.

Переименование и удаление файлов

Вы можете использовать методыrenameиdeleteдля переименования и удаления файлов.

В следующем примере переименовывается существующий файлtest1.txt:

Пример

#!/usr/bin/ruby #Переименовать файл test1.txt в test2.txt File.rename( "test1.txt", "test2.txt" )

В следующем примере удаляется существующий файлtest2.txt:

Пример

#!/usr/bin/ruby #Удалить файл test2.txt File.delete("text2.txt")

Режимы файлов и владение

Использование методаchmodс маской для изменения режима или списка разрешений/доступа к файлу:

В следующем примере изменяется режим существующего файлаtest.txtна значение маски:

Пример

#!/usr/bin/ruby file = File.new( "test.txt", "w" ) file.chmod( 0755 )

В следующей таблице перечисленыchmodразличные маски, которые можно использовать в этом методе:

МаскаОписание
0700маска rwx для владельца
0400r, для владельца
0200w, для владельца
0100x, для владельца
0070маска rwx для группы
0040r, для группы
0020w, для группы
0010x, для группы
0007маска rwx для остальных
0004r, для остальных
0002w, для остальных
0001x, для остальных
4000Установить идентификатор пользователя при выполнении
2000Установить идентификатор группы при выполнении
1000Сохранять выгруженный текст, даже после использования

Запросы к файлам

Следующая команда проверяет, существует ли файл перед открытием файла:

Пример

#!/usr/bin/ruby File.open("file.rb") if File::exists?( "file.rb" )

Следующая команда проверяет, действительно ли файл является файлом:

Пример

#!/usr/bin/ruby #Возвращает true или false. File.file?( "text.txt" )

Следующая команда проверяет, является ли заданное имя файла каталогом:

Пример

#!/usr/bin/ruby #Каталог File::directory?( "/usr/local/bin" ) # => true #Файл File::directory?( "file.rb" ) # => false

Следующая команда проверяет, является ли файл читаемым, записываемым и исполняемым:

Пример

#!/usr/bin/ruby File.readable?( "test.txt" ) # => true File.writable?( "test.txt" ) # => true File.executable?( "test.txt" ) # => false

Следующая команда проверяет, равен ли размер файла нулю:

Пример

#!/usr/bin/ruby File.zero?( "test.txt" ) # => true

Следующая команда возвращает размер файла:

Пример

#!/usr/bin/ruby File.size?( "text.txt" ) # => 1002

Следующая команда используется для проверки типа файла:

Пример

#!/usr/bin/ruby File::ftype( "test.txt" ) # => file

Метод ftype определяет тип файла, возвращая одно из следующих значений:file, directory, characterSpecial, blockSpecial, fifo, link, socket или unknown。

Следующая команда используется для проверки времени создания, изменения или последнего доступа к файлу:

Пример

#!/usr/bin/ruby File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008 File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008 File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Каталоги в Ruby

Все файлы содержатся в каталогах, и Ruby предоставляет способы обработки файлов и каталогов.FileКласс File используется для обработки файлов,Dirа класс Dir используется для обработки каталогов.

Просмотр каталогов

Чтобы изменить каталог в программе Ruby, используйтеDir.chdir. Следующий пример изменяет текущий каталог на/usr/bin。

Dir.chdir("/usr/bin")

Вы можете использовать Dir.pwdдля просмотра текущего каталога:

puts Dir.pwd #Возвращает текущий каталог, аналогично /usr/bin

Вы можете использоватьDir.entriesчтобы получить список файлов и каталогов в указанном каталоге:

puts Dir.entries("/usr/bin").join(' ')

Dir.entriesВозвращает массив, содержащий все элементы в указанном каталоге.Dir.foreachПредоставляет ту же функциональность:

Dir.foreach("/usr/bin") do |entry| puts entry end

Более краткий способ получить список каталога — использовать методы Dir, подобные массивам:

Dir["/usr/bin/*"]

Создание каталогов

Dir.mkdirМожно использовать для создания каталогов:

Dir.mkdir("mynewdir")

Вы также можете задать права доступа для нового каталога (не для существующего каталога) с помощью mkdir:

Примечание:Маска 755 задаёт права для владельца, группы и остальных (любого) как rwxr-xr-x, где r = чтение, w = запись, x = выполнение.

Dir.mkdir( "mynewdir", 755 )

Удаление каталогов

Dir.deleteМожно использовать для удаления каталога.Dir.unlinkиDir.rmdirВыполняют ту же функцию, обеспечивая удобство.

Dir.delete("testdir")

Создание файлов и временных каталогов

Временные файлы — это информация, которая просто создаётся во время выполнения программы, но не сохраняется постоянно.

Dir.tmpdirпредоставляет путь к временному каталогу в текущей системе, но этот метод недоступен по умолчанию. Чтобы сделатьDir.tmpdirдоступным, необходимо require 'tmpdir'.

Вы можете использоватьDir.tmpdirиFile.joinвместе, чтобы создать временный файл, не зависящий от платформы:

require 'tmpdir' tempfilename = File.join(Dir.tmpdir, "tingtong") tempfile = File.new(tempfilename, "w") tempfile.puts "Это временный файл" tempfile.close File.delete(tempfilename)

Этот код создаёт временный файл, записывает в него данные, а затем удаляет файл. Стандартная библиотека Ruby также включает библиотеку под названиемTempfileбиблиотека, которую можно использовать для создания временных файлов:

require 'tempfile' f = Tempfile.new('tingtong') f.puts "Привет" puts f.path f.close

Встроенные функции

Ниже приведён полный список встроенных функций для работы с файлами и каталогами в Ruby:

Другие расширения