English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby 文件的输入与输出

Ruby bietet eine umfassende Reihe von I/Die mit O verbundenen Methoden werden im Kernel-Modul implementiert. Alle I/Die O-Methode leitet sich von der IO-Klasse ab.

IO bietet alle grundlegenden Methoden, wie z.B. read、write、gets、puts、readline、getcprintf

Dieses Kapitel wird alle grundlegenden I/Funktionen. Weitere Funktionen finden Sie in der Ruby-Dokumentation. IO Klasse.

puts Der Befehl

In den vorherigen Kapiteln haben Sie Werte zugewiesen und dann puts Der Befehl gibt aus.

puts Der Befehl weist dem Programm an, den Wert, der in der Variable gespeichert ist, anzuzeigen. Dies fügt am Zeilenende eine neue Zeile hinzu.

Online-Beispiel

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

Die folgenden Beispiele geben die folgenden Ausgabeergebnisse zurück:

This is variable one
This is variable two

gets Der Befehl

gets Der Befehl kann verwendet werden, um die Eingabe vom Standardbildschirm STDIN zu erhalten.

Online-Beispiel

Der folgende Code zeigt, wie der Befehl gets verwendet wird. Der Code fordert den Benutzer auf, einen Wert einzugeben, der in der Variable val gespeichert wird und schließlich auf STDOUT ausgegeben wird.

Online-Beispiel

#!/usr/bin/ruby
 
puts "Geben Sie einen Wert ein:"
val = gets
puts val

Die folgenden Beispiele geben die folgenden Ausgabeergebnisse zurück:

Geben Sie einen Wert ein:
This is entered value
This is entered value

putc Der Befehl

von puts Der Befehl unterscheidet sich vonputs Der Befehl gibt die gesamte Zeichenfolge auf dem Bildschirm aus, während putc Der Befehl kann verwendet werden, um einen Zeichenfolge nach dem anderen auszugeben.

Online-Beispiel

Die Ausgabe des folgenden Codes ist nur der Buchstabe H:

Online-Beispiel

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

Die folgenden Beispiele geben die folgenden Ausgabeergebnisse zurück:

H

print Der Befehl

print Der Befehl puts Der Unterschied liegt darin puts Der Cursor springt nach der Ausgabe in die nächste Zeile, während print Wenn der Cursor bei der Eingabe eines Zeilenenden steht.

Online-Beispiel

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

Die folgenden Beispiele geben die folgenden Ausgabeergebnisse zurück:

Hello WorldGood Morning

Datei öffnen und schließen

Bis jetzt haben Sie den Standard-Eingang und -Ausgang gelesen und geschrieben. Jetzt werden wir sehen, wie man mit tatsächlichen Daten Dateien umgeht.

File.new 方法

您可以使用 File.new Methode erstellt eine File Objekte zum Lesen, Schreiben oder Lesen/Schreiben verwendet, das Lesen/Schreiben-Recht hängt vom Parameter mode ab. Schließlich können Sie File.close Methode, um die Datei zu schließen.

Syntax

aFile = File.new("filename", "mode")
   # ... Datei verarbeiten
aFile.close

File.open 方法

您可以使用 File.open Methode erstellt ein neues Dateiobjekt und weist dieses Dateiobjekt der Datei zu. Aber,File.openFile.new Methoden gibt es einige Unterschiede. Der Unterschied ist File.open Methode kann mit einem Block verknüpft werden, während File.new Methode kann nicht.

File.open("filename", "mode") do |aFile|
   # ... Datei verarbeiten
end

Die folgende Tabelle listet die verschiedenen Öffnungsmodi für Dateien auf:

Modus描述
rNur-Lese-Modus. Der Dateipfeil wird am Anfang der Datei platziert. Dies ist der Standardmodus.
r+Lesen- und Schreibmodus. Der Dateipfeil wird am Anfang der Datei platziert.
wSchreibmodus. Wenn die Datei existiert, wird die Datei überschrieben. Wenn die Datei nicht existiert, wird eine neue Datei zum Schreiben erstellt.
w+Lesen- und Schreibmodus. Wenn die Datei existiert, wird die vorhandene Datei überschrieben. Wenn die Datei nicht existiert, wird eine neue Datei zum Lesen und Schreiben erstellt.
aSchreibmodus. Wenn die Datei existiert, wird der Dateipfeil am Ende der Datei platziert. Das bedeutet, dass die Datei im Anhangemodus ist. Wenn die Datei nicht existiert, wird eine neue Datei zum Schreiben erstellt.
a+Lesen- und Schreibmodus. Wenn die Datei existiert, wird der Dateipfeil am Ende der Datei platziert. Das bedeutet, dass die Datei im Anhangemodus ist. Wenn die Datei nicht existiert, wird eine neue Datei zum Lesen und Schreiben erstellt.

Lesen und Schreiben von Dateien

für einfache I/Das O-Objekt bietet auch Methoden für alle file-Objekte. Daher liest gets eine Zeile vom Standard-Eingabe.aFile.gets eine Zeile aus dem Dateiobjekt aFile lesen.

aber, I/Das O-Objekt bietet zusätzliche Einstellungen für den Zugriffsmethoden und bietet uns Bequemlichkeit.

sysread 方法

Sie können die Methode sysread um den Inhalt der Datei zu lesen. Wenn Sie die Methode sysread verwenden, können Sie jede Art von Öffnungsmodus verwenden. Zum Beispiel:

Hier ist der Input-Textdatei:

Dies ist eine einfache Textdatei zum Testzweck.

Lassen Sie uns nun versuchen, diese Datei zu lesen:

Online-Beispiel

#!/usr/bin/ruby
 
aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   puts "Kann Datei nicht öffnen!"
end

Diese Anweisung platziert den Dateipfeil am Anfang des Eingabedatei. 20 Zeichen. Der Dateipfeil wird an der Position 0 der Datei platziert. 21 an einer Zeichenposition.

syswrite 方法

Sie können die Methode syswrite Um Inhalte in die Datei zu schreiben, verwenden Sie die Methode syswrite. Wenn Sie die Methode syswrite verwenden, müssen Sie die Datei im Schreibmodus öffnen. Zum Beispiel:

Online-Beispiel

#!/usr/bin/ruby
 
aFile = File.new("input.txt", "r")+")
if aFile
   aFile.syswrite("ABCDEF")
else
   puts "Kann Datei nicht öffnen!"
end

Diese Anweisung schreibt "ABCDEF" in die Datei.

each_byte 方法

Diese Methode gehört zur Klasse File. Methode each_byte ist ein Iterator, der jeden Zeichen einer Zeichenkette durchläuft. Sehen Sie sich das folgende Beispiel an:

Online-Beispiel

#!/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 "Kann Datei nicht öffnen!"
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 的使用:

Online-Beispiel

#!/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 不是返回一个数组。例如:

Online-Beispiel

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

这段代码将把文件 test 的内容逐行传给变量 block,然后输出将显示在屏幕上。

重命名和删除文件

您可以通过 renamedelete 方法重命名和删除文件。

下面的示例重命名一个已存在文件 test1.txt

Online-Beispiel

#!/usr/bin/ruby
 
# 重命名文件 test1.txt 为 test2.txt
File.rename( "test1.txt", "test2.txt" )

下面的示例删除一个已存在文件 test2.txt

Online-Beispiel

#!/usr/bin/ruby
 
# 删除文件 test2.txt
File.delete("text2.txt")

文件模式与所有权

使用带有掩码的 chmod 方法来改变文件的模式或权限/访问列表:

下面的示例改变一个已存在文件 test.txt 的模式为一个掩码值:

Online-Beispiel

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

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

掩码描述
0700rwx 掩码,针对所有者
0400r ,针对所有者
0200w ,针对所有者
0100x ,针对所有者
0070rwx 掩码,针对所属组
0040r, für die Gruppe
0020w, für die Gruppe
0010x, für die Gruppe
0007rwx-Maske, für andere
0004r, für andere
0002w, für andere
0001x, für andere
4000Setzt bei der Ausführung den Benutzer-ID
2000Setzt bei der Ausführung den Gruppen-ID
1000Speichert den Austauschstext, auch nach der Verwendung

Dateisuche

Die folgenden Befehle überprüfen vor dem Öffnen der Datei, ob die Datei existiert:

Online-Beispiel

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

Die folgenden Befehle fragen ab, ob der Dateiname tatsächlich eine Datei ist:

Online-Beispiel

#!/usr/bin/ruby
 
# Ruft true oder false zurück
File.file?("text.txt")

Die folgenden Befehle überprüfen, ob der angegebene Dateiname ein Verzeichnis ist:

Online-Beispiel

#!/usr/bin/ruby
 
# Ein Verzeichnis
File::directory?(""/usr/local/"bin") # => true
 
# Eine Datei
File::directory?("file.rb") # => false

Die folgenden Befehle überprüfen, ob die Datei lesbar, schreibbar oder ausführbar ist:

Online-Beispiel

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

Die folgenden Befehle überprüfen, ob die Datei die Größe null hat:

Online-Beispiel

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

Die folgenden Befehle geben die Größe der Datei zurück:

Online-Beispiel

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

Die folgenden Befehle dienen dazu, den Dateityp der Datei zu überprüfen:

Online-Beispiel

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

Die ftype-Methode identifiziert den Dateityp durch die Rückgabe eines der folgenden Werte:file, directory, characterSpecial, blockSpecial, fifo, link, socket oder unbekannt

Die folgenden Befehle dienen dazu, das Erstellungs-, Änderungs- oder Letzter-Zugriffsdatum der Datei zu überprüfen:

Online-Beispiel

#!/usr/bin/ruby
 
File::ctime("test.txt") # => Freitag Mai 09 10:06:37 -0700 2008
File::mtime("text.txt") # => Freitag Mai 09 10:44:44 -0700 2008
File::atime("text.txt") # => Freitag Mai 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 中处理文件和目录的内建函数的完整列表: