Ruby 檔案的輸入與輸出

Ruby 檔案的輸入與輸出

Ruby 提供了一整套 I/O 相關的方法,在核心(Kernel)模組中實現。所有的 I/O 方法派生自 IO 類。

IO 提供了所有基礎的方法,比如 read、 write、 gets、 puts、 readline、 getcprintf

本章節將講解所有 Ruby 中可用的基礎的 I/O 函式。如需瞭解更多的函式,請檢視 Ruby 的 IO 類。

puts 語句

在前面的章節中,您賦值給變數,然後使用 puts 語句列印輸出。

puts 語句指示程式顯示儲存在變數中的值。這將在每行末尾新增一個新行。

例項

#!/usr/bin/ruby val1 = "This is variable one" val2 = "This is variable two" puts val1 puts val2

以上例項執行輸出結果為:

This is variable one
This is variable two

gets 語句

gets 語句可用於獲取來自名為 STDIN 的標準螢幕的使用者輸入。

例項

下面的程式碼演示瞭如何使用 gets 語句。該程式碼將提示使用者輸入一個值,該值將被儲存在變數 val 中,最後會被列印在 STDOUT 上。

例項

#!/usr/bin/ruby puts "Enter a value :" val = gets puts val

以上例項執行輸出結果為:

Enter a value :
This is entered value
This is entered value

putc 語句

puts 語句不同,puts 語句輸出整個字串到螢幕上,而 putc 語句可用於依次輸出一個字元。

例項

下面程式碼的輸出只是字元 H:

例項

#!/usr/bin/ruby str="Hello Ruby!" putc str

以上例項執行輸出結果為:

H

print 語句

print 語句與 puts 語句類似。唯一的不同在於 puts 語句在輸出內容後會跳到下一行,而使用 print 語句時,游標定位在同一行。

例項

#!/usr/bin/ruby print "Hello World" print "Good Morning"

以上例項執行輸出結果為:

Hello WorldGood Morning

開啟和關閉檔案

截至現在,您已經讀取並寫入標準輸入和輸出。現在,我們將看看如何操作實際的資料檔案。

File.new 方法

您可以使用 File.new 方法建立一個 File 物件用於讀取、寫入或者讀寫,讀寫許可權取決於 mode 引數。最後,您可以使用 File.close 方法來關閉該檔案。

語法

aFile = File.new("filename", "mode") # ... 處理檔案 aFile.close

File.open 方法

您可以使用 File.open 方法建立一個新的 file 物件,並把該 file 物件賦值給檔案。但是,File.openFile.new 方法之間有一點不同。不同點是 File.open 方法可與塊關聯,而 File.new 方法不能。

File.open("filename", "mode") do |aFile| # ... process the file end

下表列出了開啟檔案的不同模式:

模式描述
r只讀模式。檔案指標被放置在檔案的開頭。這是預設模式。
r+讀寫模式。檔案指標被放置在檔案的開頭。
w只寫模式。如果檔案存在,則重寫檔案。如果檔案不存在,則建立一個新檔案用於寫入。
w+讀寫模式。如果檔案存在,則重寫已存在的檔案。如果檔案不存在,則建立一個新檔案用於讀寫。
a只寫模式。如果檔案存在,則檔案指標被放置在檔案的末尾。也就是說,檔案是追加模式。如果檔案不存在,則建立一個新檔案用於寫入。
a+讀寫模式。如果檔案存在,則檔案指標被放置在檔案的末尾。也就是說,檔案是追加模式。如果檔案不存在,則建立一個新檔案用於讀寫。

讀取和寫入檔案

用於簡單 I/O 的方法也可用於所有 file 物件。所以,gets 從標準輸入讀取一行,aFile.gets 從檔案物件 aFile 讀取一行。

但是,I/O 物件提供了訪問方法的附加設定,為我們提供了便利。

sysread 方法

您可以使用方法 sysread 來讀取檔案的內容。當使用方法 sysread 時,您可以使用任意一種模式開啟檔案。例如:

下面是輸入文字檔案:

This is a simple text file for testing purpose.

現在讓我們嘗試讀取這個檔案:

例項

#!/usr/bin/ruby aFile = File.new("input.txt", "r") if aFile content = aFile.sysread(20) puts content else puts "Unable to open file!" end

該語句將輸入檔案的頭 20 個字元。檔案指標將被放置在檔案中第 21 個字元的位置。

syswrite 方法

您可以使用方法 syswrite 來向檔案寫入內容。當使用方法 syswrite 時,您需要以寫入模式開啟檔案。例如:

例項

#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Unable to open file!" end

該語句將寫入 "ABCDEF" 到檔案中。

each_byte 方法

該方法屬於類 File。方法 each_byte 是個可以迭代字串中每個字元。請看下面的程式碼例項:

例項

#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") aFile.rewind aFile.each_byte {|ch| putc ch; putc ?. } else puts "Unable to open file!" end

字元一個接著一個被傳到變數 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...

IO.readlines 方法

File 是類 IO 的一個子類。類 IO 也有一些用於操作檔案的方法。

IO.readlines 是 IO 類中的一個方法。該方法逐行返回檔案的內容。下面的程式碼顯示了方法 IO.readlines 的使用:

例項

#!/usr/bin/ruby arr = IO.readlines("input.txt") puts arr[0] puts arr[1]

在這段程式碼中,變數 arr 是一個數組。檔案 input.txt 的每一行將是陣列 arr 中的一個元素。因此,arr[0] 將包含第一行,而 arr[1] 將包含檔案的第二行。

IO.foreach 方法

該方法也逐行返回輸出。方法 foreach 與方法 readlines 之間不同的是,方法 foreach 與塊相關聯。但是,不像方法 readlines,方法 foreach 不是返回一個數組。例如:

例項

#!/usr/bin/ruby IO.foreach("input.txt"){|block| puts block}

這段程式碼將把檔案 test 的內容逐行傳給變數 block,然後輸出將顯示在螢幕上。

重新命名和刪除檔案

您可以通過 renamedelete 方法重新命名和刪除檔案。

下面的例項重新命名一個已存在檔案 test1.txt

例項

#!/usr/bin/ruby # 重新命名檔案 test1.txt 為 test2.txt File.rename( "test1.txt", "test2.txt" )

下面的例項刪除一個已存在檔案 test2.txt

例項

#!/usr/bin/ruby # 刪除檔案 test2.txt File.delete("text2.txt")

檔案模式與所有權

使用帶有掩碼的 chmod 方法來改變檔案的模式或許可權/訪問列表:

下面的例項改變一個已存在檔案 test.txt 的模式為一個掩碼值:

例項

#!/usr/bin/ruby file = File.new( "test.txt", "w" ) file.chmod( 0755 )

下表列出了 chmod 方法中可使用的不同的掩碼:

掩碼描述
0700rwx 掩碼,針對所有者
0400r ,針對所有者
0200w ,針對所有者
0100x ,針對所有者
0070rwx 掩碼,針對所屬組
0040r ,針對所屬組
0020w ,針對所屬組
0010x ,針對所屬組
0007rwx 掩碼,針對其他人
0004r ,針對其他人
0002w ,針對其他人
0001x ,針對其他人
4000執行時設定使用者 ID
2000執行時設定所屬組 ID
1000儲存交換文字,甚至在使用後也會儲存

檔案查詢

下面的命令在開啟檔案前檢查檔案是否已存在:

例項

#!/usr/bin/ruby File.open("file.rb") if File::exists?( "file.rb" )

下面的命令查詢檔案是否確實是一個檔案:

例項

#!/usr/bin/ruby # 返回 true 或false File.file?( "text.txt" )

下面的命令檢查給定的檔名是否是一個目錄:

例項

#!/usr/bin/ruby # 一個目錄 File::directory?( "/usr/local/bin" ) # => true # 一個檔案 File::directory?( "file.rb" ) # => false

下面的命令檢查檔案是否可讀、可寫、可執行:

例項

#!/usr/bin/ruby File.readable?( "test.txt" ) # => true File.writable?( "test.txt" ) # => true File.executable?( "test.txt" ) # => false

下面的命令檢查檔案是否大小為零:

例項

#!/usr/bin/ruby File.zero?( "test.txt" ) # => true

下面的命令返回檔案的大小:

例項

#!/usr/bin/ruby File.size?( "text.txt" ) # => 1002

下面的命令用於檢查檔案的型別:

例項

#!/usr/bin/ruby File::ftype( "test.txt" ) # => file

ftype 方法通過返回下列中的某個值來標識了檔案的型別:file、 directory、 characterSpecial、 blockSpecial、 fifo、 link、 socket 或 unknown

下面的命令用於檢查檔案被建立、修改或最後訪問的時間:

例項

#!/usr/bin/ruby File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008 File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008 File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Ruby 中的目錄

所有的檔案都是包含在目錄中,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.unlinkDir.rmdir 執行同樣的功能,為我們提供了便利。

Dir.delete("testdir")

建立檔案 & 臨時目錄

臨時檔案是那些在程式執行過程中被簡單地建立,但不會永久性儲存的資訊。

Dir.tmpdir 提供了當前系統上臨時目錄的路徑,但是該方法預設情況下是不可用的。為了讓 Dir.tmpdir 可用,使用必需的 'tmpdir' 是必要的。

您可以把 Dir.tmpdirFile.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 類和方法。