Ruby 的 I/O

我们与计算机的各种交互叫做 I/O,比如我们使用键盘输入文字、按下鼠标,计算机给在屏幕中显示我们打出文字,生成文件等。交互的数据以字符/字节流的形式发送到程序或从程序发送。本章节中我们为大家详细讲解在 Ruby 中的 I/O 对象。

1. I/O 对象

在 Ruby 中,I/O 对象包装输入/输出流。常量STDINSTDOUTSTDERR指向包装标准流的I/O对象。默认情况下,全局变量$stdin$stdout$stderr指向它们各自的常量。尽管常量应始终指向默认流,但是可以覆盖全局变量以指向另一个 I/O 流(例如文件)。

1.1 输出

使用下面的方法可以将内容输出到屏幕上:

1.1.1 puts

IO 对象可以通过 puts 进行写入操作。

实例:

$stdout.puts 'Hello World'

#---- 输出结果 ----
Hello World

另一种写法是我们常用的简易版本:

puts 'Hello World'

#---- 输出结果 ----
Hello World

1.2 print

使用 print 也可以进行写入操作。

print 'Hello World'

#---- 输出结果 ----
Hello World

需要注意一点,putsprint 的区别是 puts 在结尾有一个换行符,而 print 没有。

实例:

puts 'Hello '
puts 'World'

#---- 输出结果 ----
Hello
World
print 'Hello '
print 'World'

#---- 输出结果 ----
Hello World

1.3 p

p 相当于将puts打印的内容进行了to_s操作。

实例:

puts [1, 2, 3].to_s
p [1, 2, 3]

#---- 输出结果 ----
[1, 2, 3]
[1, 2, 3]

1.2 输入

我们使用 $stdin.gets 来让用户进行输入操作。

实例:

a = $stdin.gets 
p a
             # 键盘输入1

#---- 输出结果 ----
1
"1\n"

当然我们也可以省略 $stdin,只使用 gets

2. 文件操作

2.1 创建一个I/O对象

要创建一个新的 IO 对象,我们需要一个文件描述符。这里我们使用数值 1(stdout)。

io = IO.new(1)
io.puts 'hello world'

#---- 输出结果 ----
hello world

2.1 读取文件

I/O 对象是 File 的父类,所以可以对文件进行读写操作

让我们创建一个文件 123.txt,写入三行文字。

sentence1
sentence2
sentence3

然后使用 pwd 查找到它的绝对地址目录后。使用 IO.sysopen 并按照下面的代码进行读取操作。

a = IO.sysopen '/Users/Andrew/Desktop/123.txt'
p a
lorem = IO.new(a)
p lorem.gets

#---- 输出结果 ----
7
"sentence1\n"

由此我们读取了一行的数据,如果我们想继续读取,就要继续使用 gets

a = IO.sysopen '/Users/Andrew/Desktop/123.txt'
p a
lorem = IO.new(a)
p lorem.gets
p lorem.gets
p lorem.gets
p lorem.gets

#---- 输出结果 ----
7
"sentence1\n"
"sentence2\n"
"sentence3\n"
nil

当我们读到第四行的时候没有数据了,会返回 nil

我们可以通过 eof? 判断是否到达文件末尾,使用 pos 来获取光标位置,使用 rewind 将光标重置到顶部。

a = IO.sysopen '/Users/Andrew/Desktop/123.txt'
p a
lorem = IO.new(a)
p lorem.gets
p lorem.gets
p lorem.gets
p lorem.gets
p lorem.pos
p lorem.eof?
p lorem.rewind
p lorem.pos
p lorem.eof?

#---- 输出结果 ----
7
"sentence1\n"
"sentence2\n"
"sentence3\n"
nil
30
true
0
0
false

2.2 写入文件

继续上面文件的操作,使用 puts 可以继续写入文件。

a = IO.sysopen '/Users/Andrew/Desktop/123.txt', 'a'
p a
lorem = IO.new(a)
p lorem.puts "sentence4"
p lorem.puts "sentence5"

#---- 输出结果 ----
7
nil
nil

执行后我们查看 123.txt 文件,发现文件内容变更为:

sentence1
sentence2
sentence3
sentence4
sentence5

3. 小结

本章节中我们学习了 I/O 对象的输出(puts、print、p)和输入(gets),学习了如何创建一个 IO 对象来读取文件和写入文件。