Ruby предоставляет целый набор связанных с I/O методов, реализованных в модуле Kernel. Все методы ввода-вывода получены из класса IO.
Класс IO предоставляет все основные методы, такие как read, write, gets, puts, readline, getc, and printf.
В этой главе будут рассмотрены все основные функции ввода-вывода, доступные в Ruby. Дополнительные функции см. В Ruby Class IO.
В предыдущих главах вы присвоили значения переменным, а затем распечатали результат с помощью оператора puts.
Оператор puts указывает программе отображать значение, хранящееся в переменной. Это добавит новую строку в конце каждой строки, которую она пишет.
#!/usr/bin/ruby val1 = "Это одна переменная" val2 = "Это две переменных" puts val1 puts val2
Это приведет к следующему результату:
Это одна переменная Это две переменных
Оператор gets может использоваться для ввода любого ввода от пользователя со стандартного экрана STDIN.
Следующий код показывает, как использовать оператор gets. Этот код предложит пользователю ввести значение, которое будет храниться в переменной val и, наконец, будет напечатано на STDOUT.
#!/usr/bin/ruby puts "Введите значение :" val = gets puts val
Это приведет к следующему результату:
Введите значение : Это введенное значение Это введенное значение
В отличие от оператора puts, который выводит всю строку на экран, оператор putc может использоваться для вывода одного символа за раз.
Результатом следующего кода является только символ H:
#!/usr/bin/ruby str = "Привет, Ruby!" putc str
Это приведет к следующему результату:
H
Оператор print похож на оператор puts. Единственное отличие состоит в том, что оператор puts переходит к следующей строке после печати содержимого, тогда как с оператором print курсор помещается в одну строку.
#!/usr/bin/ruby print "Привет Мир" print "Доброе утро"
Это приведет к следующему результату:
Привет МирДоброе утро
До сих пор вы читали и записывали стандартный ввод и вывод. Теперь мы увидим, как играть с фактическими файлами данных.
Вы можете создать объект File, используя метод File.new для чтения, записи или и того и другого, в соответствии с строкой режима. Наконец, вы можете использовать метод File.close для закрытия этого файла.
aFile = File.new("filename", "mode") # ... обработать файл aFile.close
Вы можете использовать метод File.open для создания нового файлового объекта и назначить этот файловый объект файлу. Однако существует одна разница между методами File.open и File.new. Разница в том, что метод File.open может быть связан с блоком, тогда как вы не можете сделать то же самое с помощью метода File.new.
File.open("filename", "mode") do |aFile| # ... обработать файл end
Те же методы, которые мы использовали для «простых» операций ввода-вывода, доступны для всех объектов файлов. Таким образом, считывается строка из стандартного ввода, а aFile.gets считывает строку из файлового объекта aFile.
Однако объекты ввода-вывода предоставляют дополнительный набор методов доступа, облегчающих нашу жизнь.
Вы можете использовать метод 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. Например,
#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Невозможно открыть файл!" end
Этот оператор напишет «ABCDEF» в файл.
Этот метод принадлежит к классe file. Метод each_byte всегда связан с блоком. Рассмотрим следующий пример кода:
#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") aFile.each_byte {|ch| putc ch; putc ?. } else puts "Невозможно открыть файл!" end
Символы передаются один за другим переменной ch и затем отображаются на экране следующим образом:
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. Класс IO также имеет некоторые методы, которые могут использоваться для управления файлами.
Одним из методов класса IO является IO.readlines. Этот метод возвращает содержимое файла по строкам. Следующий код показывает использование метода IO.readlines:
#!/usr/bin/ruby arr = IO.readlines("input.txt") puts arr[0] puts arr[1]
В этом коде переменная arr является массивом. Каждая строка файла input.txt будет элементом в массиве arr. Следовательно, arr [0] будет содержать первую строку, тогда как arr [1] будет содержать вторую строку файла.
Этот метод также возвращает вывод строки за строкой. Разница между методом foreach и метода readlines заключается в том, что метод foreach связан с блоком. Однако, в отличие от метода readlines, метод foreach не возвращает массив. Например,
#!/usr/bin/ruby IO.foreach("input.txt"){|block| puts block}
Этот код передает содержимое файла test по строке в блок переменной, а затем вывод будет отображаться на экране.
Вы можете переименовывать и удалять файлы программно в Ruby с помощью методов rename и delete.
Ниже приведен пример переименования существующего файла test1.txt:
#!/usr/bin/ruby # Rename a file from test1.txt to test2.txt File.rename( "test1.txt", "test2.txt" )
Ниже приведен пример удаления существующего файла test2.txt:
#!/usr/bin/ruby # Delete file test2.txt File.delete("test2.txt")
Используйте метод chmod с маской для изменения режима или списка разрешений/доступа к файлу:
Ниже приведен пример изменения режима существующего файла test.txt на значение маски:
#!/usr/bin/ruby file = File.new( "test.txt", "w" ) file.chmod( 0755 )
Следующая команда проверяет, существует ли файл перед его открытием:
#!/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 # a file 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" ) # => файл
Метод ftype идентифицирует тип файла, возвращая один из следующих: file, directory, characterSpecial, blockSpecial, fifo, link, socket, or unknown.
Следующая команда может использоваться, чтобы найти, когда файл был создан, изменен или последний доступ:
#!/usr/bin/ruby File::ctime( "test.txt" ) # => The Aug 23 12:21:21:0700 2018 File::mtime( "text.txt" ) # => The Aug 23 12:25:56:0700 2018 File::atime( "text.txt" ) # => The Aug 23 12:45:24:0700 2018
Все файлы содержатся в разных каталогах, и Ruby не имеет проблем с этим. В то время как класс File обрабатывает файлы, каталоги обрабатываются классом 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’s class:
Dir["/usr/bin/*"]
Dir.mkdir может быть использован для создания каталогов:
Dir.mkdir("andreyexnewdir")
Вы также можете установить разрешения для нового каталога (не одного, который уже существует) с помощью mkdir:
Dir.mkdir( "andreyexnewdir", 755 )
Dir.delete может быть использован для удаления каталога. Dir.unlink и Dir.rmdir выполняет точно такую же функцию и предоставляются для удобства.
Dir.delete("andreyextestdir")
Временные файлы: это те, которые могут быть созданы ненадолго во время выполнения программы, но не являются постоянным хранилищем информации.
Dir.tmpdir предоставляет путь к временному каталогу в текущей системе, хотя метод по умолчанию недоступен. Чтобы сделать доступным Dir.tmpdir, необходимо использовать require ‘tmpdir’.
Вы можете использовать Dir.tmpdir с File.join для создания независимого от платформы временного файла:
require 'tmpdir' tempfilename = File.join(Dir.tmpdir, "andreyex") tempfile = File.new(tempfilename, "w") tempfile.puts "Это временный файл" tempfile.close File.delete(tempfilename)
Этот код создает временный файл, записывает в него данные и удаляет его. Стандартная библиотека Ruby также включает библиотеку под названием Tempfile, которая может создавать для вас временные файлы:
require 'tempfile' f = Tempfile.new('andreyex') f.puts "Привет" puts f.path f.close
Вот встроенные функции для обработки файлов и каталогов: