Ruby 开发(九) - 文件 IO(中)

316 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

二、读取文件

使用 Ruby 读取文件首先要打开文件,之后再进行读取的操作,当然有打开就有关闭。

打开文件

使用 File 类的 open 方法打开文件

File 类的 open 方法打开文件的方式与 new 方法类似,但是 open 方法可以给该方法传递一个代码块作为参数,如果代码块调用 open 方法时,系统会把文件对象传递给代码块,然后开始执行代码块。

path = "readme.txt"
File.open(path) do |file|
  # file 既文件对象
  # 这里可以执行对 file 的操作
end

使用 open 函数打开文件

使用 open 函数打开文件与 File 类调用 open 方法打开文件的方式类似,都可以传递一个代码块,也可以使用该方法返回的文件对象。

path = "readme.txt"

open(path) do |file|
  # 操作 file 对象的代码块
end

关闭文件

有打开就有关闭,关闭文件使用的是 File 对象的 close 方法

path = "readme.txt"
file = open(path)

# 操作file 对象

file.clone

除了 close 方法之外,还可以使用 File 类的 close_read 方法和 close_write 方法,这两个方法分别用于关闭只读模式打开的文件和只写模式打开的文件,但是通常情况下不管是只读还是只写模式打开的文件,统统都可以使用 close 方法关闭掉。

读取文件

Ruby 中提供了多种用于读取文件的方法,如 read、readchar、readline、gets 等。

read 方法读取文件

read 方法可以从文件对象中读取指定字节数的文本,如果指定字节数大于文件内容的长度,将直接读取到文件末尾。

read(length, buff)

read 方法中的第一个参数就是读取文本的长度,第二个参数是用来保存读取的文件,是可选的。

readme.txt 文件中的内容为:

README Content
path = "readme.txt"

file = File.new(path, "r")

puts file.read(10)

puts file.read(2)

file.close

执行上述代码,输出结果如下:

README Con
te

可以看出指针会随着读取的内容往前移动,Ruby 中也提供了一些方法来操作指针,如获取指针位置,设置指针位置等...

  • pos:获取指针位置
  • pos= :设置指针位置
  • rewind:将指针位置设置为文件开始
  • lineno:获取指针所在行
  • lineno= :设置指针所在的行
path = "readme.txt"
file = File.new(path, "r")

puts file.read(10)
puts "当前指针所在位置:#{file.pos}"

# 设置指针位置
file.pos = 2

puts file.read(2)

puts "当前指针所在行:#{file.lineno}"
puts "回到文本开始位置"
file.rewind

puts file.read(10)

file.close

执行上述代码,输出结果如下:

README Con
当前指针所在位置:10
AD
当前指针所在行:0
回到文本开始位置
README Con

文本行数是从 0 开始的,指针的位置是从 1 开始的

readchar 方法读取文件

readchar 方法可以从文件中读取一个字符。

path = "readme.txt"
file = File.new(path, "r")

puts file.readchar
puts file.readchar
puts file.readchar
puts "当前指针的位置:#{file.pos}"

file.close

执行上述代码,输出结果如下:

R
E
A
当前指针的位置:3

readchar 方法一次只读一个字符,无须参数。read 方法可以指定读取的长度,两者都可以通过操作指针开决定读取的位置

readline 方法和 readlines 方法读取文件

readline 方法可以从给指定的文件中读取一行,当读到文件末尾时会引发 EOF 异常。 readlines 方法可以读取文件的所有行,并把所有内容保存到数组中,数组中的每一个元素都是文件中的一行内容。

使用 readline 方法读取文件内容

path = "readme.txt"
file = File.new(path, "r")

while line = file.readline
  puts line
end

file.close

执行上述代码,输出结果如下:

README Content Line 1
README Content Line 2
README Content Line 3
README Content Line 4
README Content Line 5
Traceback (most recent call last):
	1: /ruby-file/ex8.rb:5:in `<main>'
/ruby-file/ex8.rb:5:in `readline': end of file reached (EOFError)

使用 readlines 方法读取文件内容

path = "readme.txt"
file = File.new(path, "r")

lines = file.readlines
puts lines

file.close

执行上述代码,输出结果如下:

README Content Line 1
README Content Line 2
README Content Line 3
README Content Line 4
README Content Line 5