Ruby 的 I/O
我们与计算机的各种交互叫做 I/O,比如我们使用键盘输入文字、按下鼠标,计算机给在屏幕中显示我们打出文字,生成文件等。交互的数据以字符/字节流的形式发送到程序或从程序发送。本章节中我们为大家详细讲解在 Ruby 中的 I/O 对象。
1. I/O 对象
在 Ruby 中,I/O 对象包装输入/输出流。常量STDIN
,STDOUT
和STDERR
指向包装标准流的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
需要注意一点,puts
和 print
的区别是 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 对象来读取文件和写入文件。