Ruby 的 I/O
我們與計算機的各種交互叫做 I/O,比如我們使用鍵盤輸入文字、按下鼠標,計算機給在屏幕中顯示我們打出文字,生成文件等。交互的數(shù)據(jù)以字符/字節(jié)流的形式發(fā)送到程序或從程序發(fā)送。本章節(jié)中我們?yōu)榇蠹以敿氈v解在 Ruby 中的 I/O 對象。
1. I/O 對象
在 Ruby 中,I/O 對象包裝輸入/輸出流。常量STDIN
,STDOUT
和STDERR
指向包裝標準流的I/O對象。默認情況下,全局變量$stdin
,$stdout
和$stderr
指向它們各自的常量。盡管常量應始終指向默認流,但是可以覆蓋全局變量以指向另一個 I/O 流(例如文件)。
1.1 輸出
使用下面的方法可以將內(nèi)容輸出到屏幕上:
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
的區(qū)別是 puts
在結尾有一個換行符,而 print
沒有。
實例:
puts 'Hello '
puts 'World'
#---- 輸出結果 ----
Hello
World
print 'Hello '
print 'World'
#---- 輸出結果 ----
Hello World
1.3 p
p
相當于將puts
打印的內(nèi)容進行了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 創(chuàng)建一個I/O對象
要創(chuàng)建一個新的 IO 對象,我們需要一個文件描述符。這里我們使用數(shù)值 1(stdout)。
io = IO.new(1)
io.puts 'hello world'
#---- 輸出結果 ----
hello world
2.1 讀取文件
I/O 對象是 File 的父類,所以可以對文件進行讀寫操作
讓我們創(chuàng)建一個文件 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"
由此我們讀取了一行的數(shù)據(jù),如果我們想繼續(xù)讀取,就要繼續(xù)使用 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
當我們讀到第四行的時候沒有數(shù)據(jù)了,會返回 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 寫入文件
繼續(xù)上面文件的操作,使用 puts
可以繼續(xù)寫入文件。
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
執(zhí)行后我們查看 123.txt 文件,發(fā)現(xiàn)文件內(nèi)容變更為:
sentence1
sentence2
sentence3
sentence4
sentence5
3. 小結
本章節(jié)中我們學習了 I/O 對象的輸出(puts、print、p)和輸入(gets),學習了如何創(chuàng)建一個 IO 對象來讀取文件和寫入文件。