21 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 物件來讀取檔案和寫入檔案。