Ruby 文件的輸入與輸出
Ruby 提供了一整套I/O 相關的方法,在內核(Kernel)模塊中實現。 所有的I/O 方法派生自IO 類。
類IO提供了所有基礎的方法,比如read、 write、 gets、 puts、 readline、 getc和printf 。
本章節將講解所有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.open和File.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,然後輸出將顯示在屏幕上。
重命名和刪除文件
您可以通過rename和delete方法重命名和刪除文件。
下面的實例重命名一個已存在文件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方法中可使用的不同的掩碼:
掩码 | 描述 |
---|---|
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 | 保存交换文本,甚至在使用后也会保存 |
文件查詢
下面的命令在打開文件前檢查文件是否已存在:
#!/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.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 中處理文件和目錄的內建函數的完整列表: