Ruby 檔案的輸入與輸出
Ruby 檔案的輸入與輸出
Ruby 提供了一整套 I/O 相關的方法,在核心(Kernel)模組中實現。所有的 I/O 方法派生自 IO 類。
類 IO 提供了所有基礎的方法,比如 read、 write、 gets、 puts、 readline、 getc 和 printf。
本章節將講解所有 Ruby 中可用的基礎的 I/O 函式。如需瞭解更多的函式,請檢視 Ruby 的 IO 類。
puts 語句
在前面的章節中,您賦值給變數,然後使用 puts 語句列印輸出。
puts 語句指示程式顯示儲存在變數中的值。這將在每行末尾新增一個新行。
例項
以上例項執行輸出結果為:
This is variable one This is variable two
gets 語句
gets 語句可用於獲取來自名為 STDIN 的標準螢幕的使用者輸入。
例項
下面的程式碼演示瞭如何使用 gets 語句。該程式碼將提示使用者輸入一個值,該值將被儲存在變數 val 中,最後會被列印在 STDOUT 上。
例項
以上例項執行輸出結果為:
Enter a value : This is entered value This is entered value
putc 語句
與 puts 語句不同,puts 語句輸出整個字串到螢幕上,而 putc 語句可用於依次輸出一個字元。
例項
下面程式碼的輸出只是字元 H:
例項
以上例項執行輸出結果為:
H
print 語句
print 語句與 puts 語句類似。唯一的不同在於 puts 語句在輸出內容後會跳到下一行,而使用 print 語句時,游標定位在同一行。
例項
以上例項執行輸出結果為:
Hello WorldGood Morning
開啟和關閉檔案
截至現在,您已經讀取並寫入標準輸入和輸出。現在,我們將看看如何操作實際的資料檔案。
File.new 方法
您可以使用 File.new 方法建立一個 File 物件用於讀取、寫入或者讀寫,讀寫許可權取決於 mode 引數。最後,您可以使用 File.close 方法來關閉該檔案。
語法
File.open 方法
您可以使用 File.open 方法建立一個新的 file 物件,並把該 file 物件賦值給檔案。但是,File.open 和 File.new 方法之間有一點不同。不同點是 File.open 方法可與塊關聯,而 File.new 方法不能。
下表列出了開啟檔案的不同模式:
模式 | 描述 |
---|---|
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.
現在讓我們嘗試讀取這個檔案:
例項
該語句將輸入檔案的頭 20 個字元。檔案指標將被放置在檔案中第 21 個字元的位置。
syswrite 方法
您可以使用方法 syswrite 來向檔案寫入內容。當使用方法 syswrite 時,您需要以寫入模式開啟檔案。例如:
例項
該語句將寫入 "ABCDEF" 到檔案中。
each_byte 方法
該方法屬於類 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...
IO.readlines 方法
類 File 是類 IO 的一個子類。類 IO 也有一些用於操作檔案的方法。
IO.readlines 是 IO 類中的一個方法。該方法逐行返回檔案的內容。下面的程式碼顯示了方法 IO.readlines 的使用:
例項
在這段程式碼中,變數 arr 是一個數組。檔案 input.txt 的每一行將是陣列 arr 中的一個元素。因此,arr[0] 將包含第一行,而 arr[1] 將包含檔案的第二行。
IO.foreach 方法
該方法也逐行返回輸出。方法 foreach 與方法 readlines 之間不同的是,方法 foreach 與塊相關聯。但是,不像方法 readlines,方法 foreach 不是返回一個數組。例如:
例項
這段程式碼將把檔案 test 的內容逐行傳給變數 block,然後輸出將顯示在螢幕上。
重新命名和刪除檔案
您可以通過 rename 和 delete 方法重新命名和刪除檔案。
下面的例項重新命名一個已存在檔案 test1.txt:
例項
下面的例項刪除一個已存在檔案 test2.txt:
例項
檔案模式與所有權
使用帶有掩碼的 chmod 方法來改變檔案的模式或許可權/訪問列表:
下面的例項改變一個已存在檔案 test.txt 的模式為一個掩碼值:
例項
下表列出了 chmod 方法中可使用的不同的掩碼:
掩碼 | 描述 |
---|---|
0700 | rwx 掩碼,針對所有者 |
0400 | r ,針對所有者 |
0200 | w ,針對所有者 |
0100 | x ,針對所有者 |
0070 | rwx 掩碼,針對所屬組 |
0040 | r ,針對所屬組 |
0020 | w ,針對所屬組 |
0010 | x ,針對所屬組 |
0007 | rwx 掩碼,針對其他人 |
0004 | r ,針對其他人 |
0002 | w ,針對其他人 |
0001 | x ,針對其他人 |
4000 | 執行時設定使用者 ID |
2000 | 執行時設定所屬組 ID |
1000 | 儲存交換文字,甚至在使用後也會儲存 |
檔案查詢
下面的命令在開啟檔案前檢查檔案是否已存在:
例項
下面的命令查詢檔案是否確實是一個檔案:
例項
下面的命令檢查給定的檔名是否是一個目錄:
例項
下面的命令檢查檔案是否可讀、可寫、可執行:
例項
下面的命令檢查檔案是否大小為零:
例項
下面的命令返回檔案的大小:
例項
下面的命令用於檢查檔案的型別:
例項
ftype 方法通過返回下列中的某個值來標識了檔案的型別:file、 directory、 characterSpecial、 blockSpecial、 fifo、 link、 socket 或 unknown。
下面的命令用於檢查檔案被建立、修改或最後訪問的時間:
例項
Ruby 中的目錄
所有的檔案都是包含在目錄中,Ruby 提供了處理檔案和目錄的方式。File 類用於處理檔案,Dir 類用於處理目錄。
瀏覽目錄
為了在 Ruby 程式中改變目錄,請使用 Dir.chdir。下面的例項改變當前目錄為 /usr/bin。
您可以通過 Dir.pwd 檢視當前目錄:
您可以使用 Dir.entries 獲取指定目錄內的檔案和目錄列表:
Dir.entries 返回一個數組,包含指定目錄內的所有項。Dir.foreach 提供了相同的功能:
獲取目錄列表的一個更簡潔的方式是通過使用 Dir 的類陣列的方法:
建立目錄
Dir.mkdir 可用於建立目錄:
您也可以通過 mkdir 在新目錄(不是已存在的目錄)上設定許可權:
注意:掩碼 755 設定所有者(owner)、所屬組(group)、每個人(world [anyone])的許可權為 rwxr-xr-x,其中 r = read 讀取,w = write 寫入,x = execute 執行。
刪除目錄
Dir.delete 可用於刪除目錄。Dir.unlink 和 Dir.rmdir 執行同樣的功能,為我們提供了便利。
建立檔案 & 臨時目錄
臨時檔案是那些在程式執行過程中被簡單地建立,但不會永久性儲存的資訊。
Dir.tmpdir 提供了當前系統上臨時目錄的路徑,但是該方法預設情況下是不可用的。為了讓 Dir.tmpdir 可用,使用必需的 'tmpdir' 是必要的。
您可以把 Dir.tmpdir 和 File.join 一起使用,來建立一個獨立於平臺的臨時檔案:
這段程式碼建立了一個臨時檔案,並向其中寫入資料,然後刪除檔案。Ruby 的標準庫也包含了一個名為 Tempfile 的庫,該庫可用於建立臨時檔案:
內建函式
下面提供了 Ruby 中處理檔案和目錄的內建函式的完整列表:
File 類和方法。
Dir 類和方法。