Ruby предоставляет полный набор методов ввода-вывода, реализованных в модуле Kernel. Все методы ввода / вывода являются производными от класса IO.
Класс IO предоставляет все основные методы, такие как чтение, запись, получение, ввод, readline, getc и printf .
В этой главе будут рассмотрены все основные функции ввода / вывода, доступные в Ruby. Для получения дополнительной информации, пожалуйста, обратитесь к Ruby Class IO .
Заявление пут
В предыдущих главах вы присвоили значения переменным, а затем распечатали выходные данные с помощью оператора put .
Оператор put указывает программе отображать значение, хранящееся в переменной. Это добавит новую строку в конце каждой строки, которую она пишет.
пример
#!/usr/bin/ruby val1 = "This is variable one" val2 = "This is variable two" puts val1 puts val2
Это даст следующий результат —
This is variable one This is variable two
Заявление получает
Оператор gets может использоваться для получения любого ввода от пользователя со стандартного экрана, называемого STDIN.
пример
Следующий код показывает, как использовать инструкцию gets. Этот код предложит пользователю ввести значение, которое будет сохранено в переменной val и, наконец, будет напечатано в STDOUT.
#!/usr/bin/ruby puts "Enter a value :" val = gets puts val
Это даст следующий результат —
Enter a value : This is entered value This is entered value
Заявление Putc
В отличие от оператора put , который выводит всю строку на экран, оператор putc может использоваться для вывода по одному символу за раз.
пример
Вывод следующего кода — это просто символ H —
#!/usr/bin/ruby str = "Hello Ruby!" putc str
Это даст следующий результат —
H
Заявление о печати
Оператор print аналогичен оператору put . Единственное отличие состоит в том, что оператор put переходит на следующую строку после печати содержимого, тогда как в операторе print курсор располагается на той же строке.
пример
#!/usr/bin/ruby print "Hello World" print "Good Morning"
Это даст следующий результат —
Hello WorldGood Morning
Открытие и закрытие файлов
До сих пор вы читали и писали на стандартный ввод и вывод. Теперь посмотрим, как играть с реальными файлами данных.
Метод File.new
Вы можете создать объект File, используя метод File.new для чтения, записи или того и другого, в соответствии со строкой режима. Наконец, вы можете использовать метод File.close, чтобы закрыть этот файл.
Синтаксис
aFile = File.new("filename", "mode") # ... process the file aFile.close
Метод File.open
Вы можете использовать метод File.open, чтобы создать новый объект файла и назначить этот объект файла файлу. Однако есть одно различие между методами File.open и File.new . Разница в том, что метод File.open можно связать с блоком, тогда как вы не можете сделать то же самое с помощью метода File.new .
File.open("filename", "mode") do |aFile| # ... process the file end
р
Режим только для чтения. Указатель файла находится в начале файла. Это режим «по умолчанию».
г +
Режим чтения-записи. Указатель файла будет в начале файла.
вес
Режим только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.
ш +
Режим чтения-записи. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.
Режим только для записи. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
а +
Режим чтения и записи. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
Чтение и запись файлов
Те же методы, которые мы использовали для «простого» ввода-вывода, доступны для всех файловых объектов. Итак, 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 "Unable to open file!" end
Этот оператор выведет первые 20 символов файла. Указатель файла теперь будет размещен на 21-м символе в файле.
Метод syswrite
Вы можете использовать метод syswrite, чтобы записать содержимое в файл. Вам нужно открыть файл в режиме записи при использовании метода syswrite. Например —
#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Unable to open file!" end
Это утверждение запишет «ABCDEF» в файл.
Метод each_byte
Этот метод относится к классу 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 "Unable to open file!" 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.readlines
Класс File является подклассом класса 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] будет содержать вторую строку файла.
Метод IO.foreach
Этот метод также возвращает вывод построчно. Разница между методом foreach и методом readlines заключается в том, что метод foreach связан с блоком. Однако, в отличие от метода readlines , метод foreach не возвращает массив. Например —
#!/usr/bin/ruby IO.foreach("input.txt"){|block| puts block}
Этот код будет построчно передавать содержимое файла теста в блок переменных, а затем вывод будет отображаться на экране.
Переименование и удаление файлов
Вы можете переименовывать и удалять файлы программно с помощью Ruby с помощью методов переименования и удаления .
Ниже приведен пример для переименования существующего файла 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 )
0700
RWX маска для владельца
0400
г для владельца
0200
ж для владельца
0100
х для владельца
0070
RWX маска для группы
0040
г для группы
0020
W для группы
0010
х для группы
0007
RWX маска для других
0004
г для других
0002
ш для других
0001
х для других
4000
Установить идентификатор пользователя при исполнении
2000
Установить идентификатор группы при исполнении
1000
Сохранить замененный текст даже после использования
Запросы файлов
Следующая команда проверяет, существует ли файл перед его открытием:
#!/usr/bin/ruby File.open("file.rb") if File::exists?( "file.rb" )
Следующая команда запрашивает, является ли файл действительно файлом —
#!/usr/bin/ruby # This returns either true or false File.file?( "text.txt" )
Следующая команда выясняет, является ли данное имя файла каталогом —
#!/usr/bin/ruby # a directory 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" ) # => file
Метод ftype идентифицирует тип файла, возвращая одно из следующих значений: файл, каталог, 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 обрабатывает файлы, каталоги обрабатываются с помощью класса Dir .
Навигация по каталогам
Чтобы изменить каталог в Ruby-программе, используйте Dir.chdir следующим образом. В этом примере текущий каталог изменяется на / usr / bin .
Dir.chdir("/usr/bin")
Вы можете узнать, что является текущим каталогом с Dir.pwd —
puts Dir.pwd # This will return something like /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 "This is a temporary file" tempfile.close File.delete(tempfilename)
Этот код создает временный файл, записывает в него данные и удаляет его. Стандартная библиотека Ruby также включает в себя библиотеку Tempfile, которая может создавать временные файлы для вас —
require 'tempfile' f = Tempfile.new('tingtong') f.puts "Hello" puts f.path f.close
Встроенные функции
Вот встроенные функции ruby для обработки файлов и каталогов: