- Ruby基础知识
- Ruby - 主页
- Ruby - 概述
- Ruby - 环境设置
- Ruby - 语法
- Ruby - 类和对象
- Ruby - 变量
- Ruby - 运算符
- Ruby - 评论
- Ruby - IF...ELSE
- Ruby - 循环
- Ruby - 方法
- Ruby - 块
- Ruby - 模块
- Ruby - 字符串
- Ruby - 数组
- Ruby - 哈希
- Ruby - 日期和时间
- Ruby - 范围
- Ruby - 迭代器
- Ruby - 文件 I/O
- Ruby - 例外
Ruby - 文件 I/O
Ruby 提供了一整套在 Kernel 模块中实现的 I/O 相关方法。所有 I/O 方法均派生自 IO 类。
IO类提供了所有基本方法,例如read、write、gets、puts、readline、getc和printf。
本章将涵盖 Ruby 中可用的所有基本 I/O 函数。更多功能请参考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 语句
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
普特克声明
与将整个字符串输出到屏幕上的put语句不同, putc语句可用于一次输出一个字符。
例子
以下代码的输出只是字符 H -
#!/usr/bin/ruby str = "Hello Ruby!" putc str
这将产生以下结果 -
H
打印声明
print语句与puts语句类似。唯一的区别是,puts语句在打印内容后转到下一行,而print语句则将光标定位在同一行。
例子
#!/usr/bin/ruby print "Hello World" print "Good Morning"
这将产生以下结果 -
Hello WorldGood Morning
打开和关闭文件
到目前为止,您一直在读取和写入标准输入和输出。现在,我们将了解如何使用实际的数据文件。
File.new 方法
您可以根据模式字符串使用File.new方法创建一个File对象,用于读取、写入或两者。最后,您可以使用File.close方法关闭该文件。
句法
aFile = File.new("filename", "mode") # ... process the file aFile.close
文件.open 方法
您可以使用File.open方法创建一个新的文件对象并将该文件对象分配给一个文件。但是, File.open和File.new方法之间有一个区别。不同之处在于File.open方法可以与块关联,而使用File.new方法则不能执行相同操作。
File.open("filename", "mode") do |aFile| # ... process the file end
读写文件
我们用于“简单”I/O 的相同方法可用于所有文件对象。因此,gets 从标准输入读取一行,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 方法
该方法属于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}
这段代码将文件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 )
文件查询
以下命令在打开文件之前测试文件是否存在 -
#!/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 内置函数 -