English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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、getc 和 printf。
Dieses Kapitel wird alle grundlegenden I/Funktionen. Weitere Funktionen finden Sie in der Ruby-Dokumentation. IO Klasse.
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.
#!/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 kann verwendet werden, um die Eingabe vom Standardbildschirm STDIN zu erhalten.
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.
#!/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
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.
Die Ausgabe des folgenden Codes ist nur der Buchstabe H:
#!/usr/bin/ruby str="Hello Ruby!" putc str
Die folgenden Beispiele geben die folgenden Ausgabeergebnisse zurück:
H
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.
#!/usr/bin/ruby print "Hello World" print "Good Morning"
Die folgenden Beispiele geben die folgenden Ausgabeergebnisse zurück:
Hello WorldGood Morning
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 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.
aFile = File.new("filename", "mode") # ... Datei verarbeiten aFile.close
您可以使用 File.open Methode erstellt ein neues Dateiobjekt und weist dieses Dateiobjekt der Datei zu. Aber,File.open 和 File.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 | 描述 |
---|---|
r | Nur-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. |
w | Schreibmodus. 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. |
a | 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 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. |
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.
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:
#!/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.
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:
#!/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.
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:
#!/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...
类 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] 将包含文件的第二行。
该方法也逐行返回输出。方法 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, für die Gruppe |
0020 | w, für die Gruppe |
0010 | x, für die Gruppe |
0007 | rwx-Maske, für andere |
0004 | r, für andere |
0002 | w, für andere |
0001 | x, für andere |
4000 | Setzt bei der Ausführung den Benutzer-ID |
2000 | Setzt bei der Ausführung den Gruppen-ID |
1000 | Speichert den Austauschstext, auch nach der Verwendung |
Die folgenden Befehle überprüfen vor dem Öffnen der Datei, ob die Datei existiert:
#!/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:
#!/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:
#!/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:
#!/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:
#!/usr/bin/ruby File.zero?("test.txt") # => true
Die folgenden Befehle geben die Größe der Datei zurück:
#!/usr/bin/ruby File.size?("text.txt") # => 1002
Die folgenden Befehle dienen dazu, den Dateityp der Datei zu überprüfen:
#!/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:
#!/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 提供了处理文件和目录的方式。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 中处理文件和目录的内建函数的完整列表: