Ruby提供了一套完整的I/O相關(guān)的內(nèi)核模塊中實(shí)現(xiàn)方法。所有I/O方法來(lái)自IO類(lèi)。
類(lèi)IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf.
本章將涵蓋所有可供在Ruby中使用的基本I/O功能。如需使用更多的功能,請(qǐng)參考Ruby的IO類(lèi)。
puts 語(yǔ)句:
在前面的章節(jié)中,你指定值的變量和然后使用聲明 puts 輸出。
puts 把語(yǔ)句指示程序顯示存儲(chǔ)在變量值。這將添加一個(gè)新行,每行末尾寫(xiě)出(輸出)。
例子:
#!/usr/bin/ruby
val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2
這將產(chǎn)生以下結(jié)果:
This is variable one
This is variable two
gets 語(yǔ)句:
gets 語(yǔ)句可以用來(lái)從用戶從標(biāo)準(zhǔn)屏幕采取輸入調(diào)用 STDIN.
例如:
下面的代碼顯示了如何使用 gets 語(yǔ)句。此代碼將提示用戶輸入一個(gè)值,將被存儲(chǔ)在一個(gè)變量val,最后將打印在 STDOUT.
#!/usr/bin/ruby
puts "Enter a value :"
val = gets
puts val
這將產(chǎn)生以下結(jié)果:
Enter a value :
This is entered value
This is entered value
putc 語(yǔ)句:
與 puts 語(yǔ)句不相同,它在屏幕上輸出整個(gè)字符串,而putc 語(yǔ)句可以用來(lái)一次輸出一個(gè)字符。
實(shí)例:
下面的代碼的輸出只是一個(gè)字符 H:
#!/usr/bin/ruby
str="Hello Ruby!"
putc str
這將產(chǎn)生以下結(jié)果:
print 語(yǔ)句:
print 語(yǔ)句是類(lèi)似 puts 語(yǔ)句。唯一的區(qū)別是,puts語(yǔ)句后進(jìn)入到下一行打印的內(nèi)容,print 語(yǔ)句將光標(biāo)定位在同一行上。
實(shí)例:
#!/usr/bin/ruby
print "Hello World"
print "Good Morning"
這將產(chǎn)生以下結(jié)果:
打開(kāi)和關(guān)閉文件:
到現(xiàn)在為止,我們已經(jīng)可以讀取和寫(xiě)入的標(biāo)準(zhǔn)輸入和輸出。我們將看看如何運(yùn)用到實(shí)際的數(shù)據(jù)文件。
File.new 方法:
可以創(chuàng)建一個(gè)的File對(duì)象使用File.new方法的讀,寫(xiě)或兩者兼有,這需要根據(jù)模式串。最后,可以使用File.close的方法來(lái)關(guān)閉該文件。
語(yǔ)法:
aFile = File.new("filename", "mode")
# ... process the file
aFile.close
File.open 方法:
可以使用File.open方法的方法來(lái)創(chuàng)建一個(gè)新的文件對(duì)象,并分配到一個(gè)文件中,文件對(duì)象。然而,F(xiàn)ile.open方法和File.new方法之間區(qū)別。 File.open方法不同的是,可以關(guān)聯(lián)一個(gè)塊,而不能在File.new方法使用。
File.open("filename", "mode") do |aFile|
# ... process the file
end
這里是一個(gè)不同的模式打開(kāi)文件列表:
讀取和寫(xiě)入文件:
同樣的方法,我們一直在使用“簡(jiǎn)單”的I/O所有文件對(duì)象。因此,gets 從標(biāo)準(zhǔn)輸入讀取一行,F(xiàn)ile.gets文件從文件對(duì)象讀取一行。
然而,I/O對(duì)象提供額外的訪問(wèn)方法,使我們的生活更輕松。
sysread 方法:
可以使用該方法sysread讀取一個(gè)文件的內(nèi)容??梢源蜷_(kāi)該文件時(shí),在任何模式中使用的方法sysread。例如:
以下是輸入文本文件:
This is a simple text file for testing purpose.
現(xiàn)在,讓我們嘗試讀取這個(gè)文件:
#!/usr/bin/ruby
aFile = File.new("input.txt", "r")
if aFile
content = aFile.sysread(20)
puts content
else
puts "Unable to open file!"
end
這條語(yǔ)句將輸出文件的前20個(gè)字符?,F(xiàn)在,將文件指針?lè)胖迷诘?1個(gè)字符。
syswrite 方法:
可以使用方法 syswrite 中的內(nèi)容寫(xiě)入到一個(gè)文件中。需要打開(kāi)該文件在寫(xiě)入模式使用方法 syswrite 時(shí)。
例如:
#!/usr/bin/ruby
aFile = File.new("input.txt", "r+")
if aFile
aFile.syswrite("ABCDEF")
else
puts "Unable to open file!"
end
這條語(yǔ)句將 “ABCDEF” 寫(xiě)入到文件中。
each_byte 方法:
這種方法屬于類(lèi) File ??偸顷P(guān)聯(lián)一個(gè)塊方法each_byte??紤]下面的代碼示例::
#!/usr/bin/ruby
aFile = File.new("input.txt", "r+")
if aFile
aFile.syswrite("ABCDEF")
aFile.each_byte {|ch| putc ch; putc ?. }
else
puts "Unable to open file!"
end
一個(gè)接一個(gè)字符傳遞變量ch,然后在屏幕上顯示如下:
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 方法:
類(lèi)File 是 IO類(lèi)的一個(gè)子類(lèi)。類(lèi)的IO也有一些方法可用于對(duì)文件進(jìn)行操作。
IO類(lèi)的方法之一是IO.readlines。此方法返回的內(nèi)容文件行。下面的代碼顯示使用方法IO.readlines:
#!/usr/bin/ruby
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]
在這段代碼中,變量arr是一個(gè)數(shù)組。將文件 input.txt 的每一行,將數(shù)組arr中的元素。因此arr[0]將包含在第一行,而到達(dá)[1]將包含該文件的第二行。
IO.foreach 方法:
此方法還返回一行一行的輸出。foreach和 readlines 方法之間的差異是 foreach方法可以帶有塊相關(guān)聯(lián),foreach不會(huì)返回一個(gè)數(shù)組。例如:
#!/usr/bin/ruby
IO.foreach("input.txt"){|block| puts block}
此代碼將傳遞該文件的內(nèi)容,測(cè)試可變塊的行,然后,輸出將被顯示在屏幕上。
重命名和刪除文件:
可以重命名和刪除文件用Ruby以編程方式使用 rename 和 delete 方法。
下面的例子,重命名現(xiàn)有文件 test1.txt:
#!/usr/bin/ruby
# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )
下面的例子刪除現(xiàn)有文件 test2.txt:
#!/usr/bin/ruby
# Delete file test2.txt
File.delete("text2.txt")
文件模式和所有權(quán):
使用chmod掩碼的方法來(lái)改變模式或權(quán)限/訪問(wèn)的文件列表:
下面的例子改變現(xiàn)有的文件test.txt模式掩碼值:
#!/usr/bin/ruby
file = File.new( "test.txt", "w" )
file.chmod( 0755 )
以下的表可以幫助選擇不同的面具為chmod方法:
文件查詢:
下面的命令測(cè)試一個(gè)文件是否存在,然后再打開(kāi)它:
#!/usr/bin/ruby
File.open("file.rb") if File::exists?( "file.rb" )
下面的命令查詢文件是否是真是個(gè)文件:
#!/usr/bin/ruby
# This returns either true or false
File.file?( "text.txt" )
給定文件名是否為一個(gè)目錄,下面的命令查找:
#!/usr/bin/ruby
# a directory
File::directory?( "/usr/local/bin" ) # => true
# a file
File::directory?( "file.rb" ) # => false
下面的命令查找該文件是否可讀,可寫(xiě)或可執(zhí)行文件:
#!/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
可以使用下面的命令找出一種類(lèi)型的文件:
#!/usr/bin/ruby
File::ftype( "test.txt" ) # => file
ftype 方法識(shí)別的文件類(lèi)型返回下列之一: file, directory, characterSpecial, blockSpecial, fifo, link, socket 或 unknown.
下面的命令可以用來(lái)發(fā)現(xiàn)當(dāng)一個(gè)文件被創(chuàng)建,修改或上次訪問(wèn):
#!/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也沒(méi)有處理這些問(wèn)題。鑒于文件中類(lèi)處理文件,使用目錄處理Dir類(lèi)。
通過(guò)目錄導(dǎo)航:
要改變一個(gè)Ruby程序的目錄內(nèi),可使用Dir.chdir如下。這個(gè)例子改變當(dāng)前目錄 /usr/bin.
可以使用 Dir.pwd 找出當(dāng)前目錄是什么:
puts Dir.pwd # This will return something like /usr/bin
得到一個(gè)使用一個(gè)特定的目錄內(nèi)的文件和目錄列表,使用 Dir.entries:
puts Dir.entries("/usr/bin").join(' ')
Dir.entries 返回一個(gè)數(shù)組的指定目錄內(nèi)的所有項(xiàng)目。Dir.foreach 提供了相同的功能:
Dir.foreach("/usr/bin") do |entry|
puts entry
end
更簡(jiǎn)捷的方法獲取目錄列表利用 Dir 類(lèi)數(shù)組的方法:
創(chuàng)建一個(gè)目錄:
可以用 Dir.mkdir,來(lái)創(chuàng)建目錄:
還可以設(shè)置一個(gè)新的目錄權(quán)限(不是一個(gè)已經(jīng)存在的)用mkdir:
注: 掩碼755設(shè)置權(quán)限所有者,組表示 [所有人] 類(lèi)似于 rwxr-xr-x , r = read, w = write, and x = execute.
Dir.mkdir( "mynewdir", 755 )
刪除目錄:
可用 Dir.delete 刪除一個(gè)目錄。Dir.unlink 和 Dir.rmdir 執(zhí)行完全相同的功能,并提供了方便。
Dir.delete("testdir")
創(chuàng)建文件和臨時(shí)目錄:
臨時(shí)文件是程序的執(zhí)行過(guò)程中可能會(huì)產(chǎn)生短暫的,但不是永久存儲(chǔ)的信息。
Dir.tmpdir 提供對(duì)當(dāng)前系統(tǒng)的臨時(shí)目錄的路徑,盡管該方法是默認(rèn)不可用。為了使 Dir.tmpdir 必要使用需要 'tmpdir'.
可以使用 Dir.tmpdir 及 File.join,創(chuàng)建一個(gè)獨(dú)立于平臺(tái)的臨時(shí)文件:
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)
此代碼創(chuàng)建一個(gè)臨時(shí)文件,寫(xiě)入數(shù)據(jù),并刪除它。 Ruby的標(biāo)準(zhǔn)庫(kù)還包括一個(gè)程式庫(kù)Tempfile ,它可以創(chuàng)建臨時(shí)文件:
require 'tempfile'
f = Tempfile.new('tingtong')
f.puts "Hello"
puts f.path
f.close
內(nèi)置功能:
這里是Ruby的支持功能,處理文件和目錄的完整列表:
- File Class and Methods.
- Dir Class and Methods.
您可能感興趣的文章:- 優(yōu)化Ruby代碼使程序運(yùn)行速度提高的例子
- 詳解Ruby中的異常
- 在Ruby中處理文件的輸入和輸出的教程