Ruby 提供了一整套 I/O 相關的方法,在內核(Kernel)模塊中實現。所有的 I/O 方法派生自 IO 類。
類 IO 提供了所有基礎的方法,比如 read、 write、 gets、 puts、 readline、 getc 和 printf。
本章節將講解所有 Ruby 中可用的基礎的 I/O 函數。如需了解更多的函數,請查看 Ruby 的 IO 類。
在前面的章節中,您賦值給變量,然後使用 puts 語句打印輸出。
puts 語句指示程序顯示存儲在變量中的值。這將在每行末尾添加一個新行。
以上實例運行輸出結果為:
This is variable one This is variable two
gets 語句可用於獲取來自名為 STDIN 的標准屏幕的用戶輸入。
下面的代碼演示了如何使用 gets 語句。該代碼將提示用戶輸入一個值,該值將被存儲在變量 val 中,最後會被打印在 STDOUT 上。
以上實例運行輸出結果為:
Enter a value : This is entered value This is entered value
與 puts 語句不同,puts 語句輸出整個字符串到屏幕上,而 putc 語句可用於依次輸出一個字符。
下面代碼的輸出只是字符 H:
以上實例運行輸出結果為:
H
print 語句與 puts 語句類似。唯一的不同在於 puts 語句在輸出內容後會跳到下一行,而使用 print 語句時,光標定位在同一行。
以上實例運行輸出結果為:
Hello WorldGood Morning
截至現在,您已經讀取並寫入標准輸入和輸出。現在,我們將看看如何操作實際的數據文件。
您可以使用 File.new 方法創建一個 File 對象用於讀取、寫入或者讀寫,讀寫權限取決於 mode 參數。最後,您可以使用 File.close 方法來關閉該文件。
您可以使用 File.open 方法創建一個新的 file 對象,並把該 file 對象賦值給文件。但是,File.open 和 File.new 方法之間有一點不同。不同點是 File.open 方法可與塊關聯,而 File.new 方法不能。
File.open("filename", "mode") do |aFile| # ... process the file end下表列出了打開文件的不同模式:
用於簡單 I/O 的方法也可用於所有 file 對象。所以,gets 從標准輸入讀取一行,aFile.gets 從文件對象 aFile 讀取一行。
但是,I/O 對象提供了訪問方法的附加設置,為我們提供了便利。
您可以使用方法 sysread 來讀取文件的內容。當使用方法 sysread 時,您可以使用任意一種模式打開文件。例如:
下面是輸入文本文件:
This is a simple text file for testing purpose.
現在讓我們嘗試讀取這個文件:
該語句將輸入文件的頭 20 個字符。文件指針將被放置在文件中第 21 個字符的位置。
您可以使用方法 syswrite 來向文件寫入內容。當使用方法 syswrite 時,您需要以寫入模式打開文件。例如:
該語句將寫入 "ABCDEF" 到文件中。
該方法屬於類 File。方法 each_byte 是個可以迭代字符串中每個字符。請看下面的代碼實例:
字符一個接著一個被傳到變量 ch,然後顯示在屏幕上,如下所示:
A.B.C.D.E.F.s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
類 File 是類 IO 的一個子類。類 IO 也有一些用於操作文件的方法。
IO.readlines 是 IO 類中的一個方法。該方法逐行返回文件的內容。下面的代碼顯示了方法 IO.readlines 的使用:
在這段代碼中,變量 arr 是一個數組。文件 input.txt 的每一行將是數組 arr 中的一個元素。因此,arr[0] 將包含第一行,而 arr[1] 將包含文件的第二行。
該方法也逐行返回輸出。方法 foreach 與方法 readlines 之間不同的是,方法 foreach 與塊相關聯。但是,不像方法 readlines,方法 foreach 不是返回一個數組。例如:
這段代碼將把文件 test 的內容逐行傳給變量 block,然後輸出將顯示在屏幕上。
您可以通過 rename 和 delete 方法重命名和刪除文件。
下面的實例重命名一個已存在文件 test1.txt:
下面的實例刪除一個已存在文件 test2.txt:
使用帶有掩碼的 chmod 方法來改變文件的模式或權限/訪問列表:
下面的實例改變一個已存在文件 test.txt 的模式為一個掩碼值:
下表列出了 chmod 方法中可使用的不同的掩碼:
下面的命令在打開文件前檢查文件是否已存在:
下面的命令查詢文件是否確實是一個文件:
下面的命令檢查給定的文件名是否是一個目錄:
下面的命令檢查文件是否可讀、可寫、可執行:
下面的命令檢查文件是否大小為零:
下面的命令返回文件的大小:
下面的命令用於檢查文件的類型:
ftype 方法通過返回下列中的某個值來標識了文件的類型:file、 directory、 characterSpecial、 blockSpecial、 fifo、 link、 socket 或 unknown。
下面的命令用於檢查文件被創建、修改或最後訪問的時間:
所有的文件都是包含在目錄中,Ruby 提供了處理文件和目錄的方式。File 類用於處理文件,Dir 類用於處理目錄。
為了在 Ruby 程序中改變目錄,請使用 Dir.chdir。下面的實例改變當前目錄為 /usr/bin。
Dir.chdir("/usr/bin")您可以通過 Dir.pwd 查看當前目錄:
puts Dir.pwd # 返回當前目錄,類似 /usr/bin您可以使用 Dir.entries 獲取指定目錄內的文件和目錄列表:
puts Dir.entries("/usr/bin").join(' ')Dir.entries 返回一個數組,包含指定目錄內的所有項。Dir.foreach 提供了相同的功能:
Dir.foreach("/usr/bin") do |entry| puts entry end獲取目錄列表的一個更簡潔的方式是通過使用 Dir 的類數組的方法:
Dir["/usr/bin/*"]Dir.mkdir 可用於創建目錄:
Dir.mkdir("mynewdir")您也可以通過 mkdir 在新目錄(不是已存在的目錄)上設置權限:
注意:掩碼 755 設置所有者(owner)、所屬組(group)、每個人(world [anyone])的權限為 rwxr-xr-x,其中 r = read 讀取,w = write 寫入,x = execute 執行。
Dir.mkdir( "mynewdir", 755 )Dir.delete 可用於刪除目錄。Dir.unlink 和 Dir.rmdir 執行同樣的功能,為我們提供了便利。
Dir.delete("testdir")臨時文件是那些在程序執行過程中被簡單地創建,但不會永久性存儲的信息。
Dir.tmpdir 提供了當前系統上臨時目錄的路徑,但是該方法默認情況下是不可用的。為了讓 Dir.tmpdir 可用,使用必需的 'tmpdir' 是必要的。
您可以把 Dir.tmpdir 和 File.join 一起使用,來創建一個獨立於平台的臨時文件:
require 'tmpdir' tempfilename = File.join(Dir.tmpdir, "tingtong") tempfile = File.new(tempfilename, "w") tempfile.puts "This is a temporary file" tempfile.close File.delete(tempfilename)這段代碼創建了一個臨時文件,並向其中寫入數據,然後刪除文件。Ruby 的標准庫也包含了一個名為 Tempfile 的庫,該庫可用於創建臨時文件:
require 'tempfile' f = Tempfile.new('tingtong') f.puts "Hello" puts f.path f.close下面提供了 Ruby 中處理文件和目錄的內建函數的完整列表:
File 類和方法。
Dir 類和方法。