Ruby提供了一整套与内核模块相关的I/O相关方法.所有I/O方法都是从类IO派生的.
类 IO 提供了所有基本方法,例如读,写,获取,puts,readline,getc,和 printf .
本章将介绍Ruby中可用的所有基本I/O函数.有关更多函数,请参阅Ruby类 IO .
在前面的章节中,您有为变量赋值,然后使用 puts 语句打印输出.
puts 语句指示程序显示存储的值变量.这将在它写入的每一行的末尾添加一个新行.
#!/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
获取语句可用于从标准屏幕STDIN中获取用户的任何输入.
以下代码显示如何使用获取声明.此代码将提示用户输入一个值,该值将存储在变量val中,最后将打印在STDOUT上.
#!/usr/bin/ruby puts "Enter a value :" val = gets puts val
这将产生以下结果 :
Enter a value : This is entered value This is entered value
与 puts 语句不同,后者输出整个字符串在屏幕上, putc 语句可用于一次输出一个字符.
输出以下代码只是字符H :
#!/usr/bin/ruby str = "Hello Ruby!" putc str
这将产生以下结果 :
H
print 语句类似于 put 声明.唯一的区别是 puts 语句在打印内容后转到下一行,而使用 print 语句时,光标位于同一行.
#!/usr/bin/ruby print "Hello World" print "Good Morning"
这将产生以下结果 :
Hello WorldGood Morning
到目前为止,你一直在阅读和写入标准输入和输出.现在,我们将看到如何使用实际数据文件.
您可以创建文件根据模式字符串使用 File.new 方法进行读取,写入或两者的对象.最后,您可以使用 File.close 方法关闭该文件.
aFile = File.new("filename", "mode") # ... process the file aFile.close
您可以使用 File.open 方法创建新文件对象并将该文件对象分配给文件.但是, File.open 和 File.new 方法之间存在一个区别.不同之处在于 File.open 方法可以与块关联,而使用 File.new 方法则不能这样做.
File.open("filename", "mode") do |aFile| # ... process the file end
Sr.No. | 模式&说明 |
---|---|
1 | r 只读模式.文件指针位于文件的开头.这是默认模式. |
2 | r + 读写模式.文件指针位于文件的开头. |
3 | w 只写模式.如果文件存在,则覆盖文件.如果文件不存在,则创建一个新文件进行写入. |
4 | w + 读写模式.如果文件存在,则覆盖现有文件.如果文件不存在,则创建一个新文件进行读写. |
5 | a 只写模式.如果文件存在,则文件指针位于文件的末尾.也就是说,文件处于追加模式.如果该文件不存在,则会创建一个新文件进行写入. |
6 | a + 读写模式.如果文件存在,则文件指针位于文件的末尾.该文件以追加模式打开.如果文件不存在,它会创建一个新文件进行读写. |
我们用于"简单"I/O的方法与所有文件对象相同.因此,从标准输入读取一行, aFile.gets 从文件对象aFile读取一行.
但是,I/O对象提供了额外的设置访问方法使我们的生活更轻松.
您可以使用方法 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方法时,需要以写入模式打开文件.例如 :
#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Unable to open file!" end
此语句将"ABCDEF"写入文件.
此方法属于类文件.方法 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.类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以编程方式重命名和删除文件和删除方法.
以下是重命名现有文件的示例 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 )
Sr.No. | Mask&说明 |
---|---|
1 | 0700 所有者的rwx面具 |
2 | 0400 r for owner |
3 | 0200 w for owner |
4 | 0100 x for owner |
5 | 0070 小组的rwx面具 |
6 | 0040 r for group |
7 | 0020 w为小组 |
8 | 0010 x for group |
9 | 0007 其他的rwx掩码 |
10 | 0004 r for其他 |
11 | 0002 w for other |
12 | 0001 x for other |
13 | 4000 执行时设置用户ID |
14 | 2000 执行时设置组ID |
15 | 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方法通过返回以下之一来确定文件的类型; 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和处理这些也没有问题.而 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内置函数:
文件类和方法。
目录类和方法。