Die Programmiersprache Ruby (German Edition)
Standardbibliothek ermöglicht uns, einen Stream-Wrapper um ein String-Objekt zu erstellen. Schließlich sind auch die Socket-Objekte, die zum Netzwerktransfer genutzt (und später noch beschrieben) werden, auch
IO
-Objekte.
9.7.1 Streams öffnen
Bevor wir Ein- oder Ausgabeoperationen vornehmen können, müssen wir ein
IO
-Objekt haben, in das wir schreiben oder aus dem wir lesen können. Die Klasse
IO
definiert die Fabrikmethoden
new
,
open
,
popen
und
pipe
, aber das sind Low-Level-Methoden mit Abhängigkeiten vom Betriebssystem, und sie werden hier nicht behandelt. Die folgenden Unterabschnitte beschreiben üblichere Wege,
IO
-Objekte zu erhalten. (Und „9.8 Netzwerk-Handling“ enthält Beispiele für die
IO
-Objekte, die über das Netzwerk kommunizieren.)
9.7.1.1 Dateien öffnen
Einer der wichtigsten Einsatzbereiche der
IO
ist das Lesen und Schreiben von Dateien. Die Klasse
File
definiert ein paar Hilfsmethoden (weiter unten beschrieben), die den gesamten Inhalt einer Datei mit einem Aufruf lesen. Häufig werden Sie aber eine Datei öffnen, um ein
File
-Objekt zu erhalten, und dann dann
IO
-Methoden verwenden, um die Datei zu lesen oder zu schreiben.
Mit
File.open
(oder
File.new
) öffnen Sie eine Datei. Das erste Argument ist der Name der Datei. Dieser wird im Allgemeinen als String spezifiziert, aber in Ruby 1.9 können Sie jedes Objekt nutzen, das eine Methode
to_path
besitzt. Dateinamen werden relativ zum aktuellen Arbeitsverzeichnis interpretiert, solange sie nicht als absoluter Pfad angegeben werden. Mit normalen Schrägstrichen trennen Sie Verzeichnisse – Ruby wandelt sie unter Windows automatisch in Backslashes um. Das zweite Argument von
File.open
ist ein kurzer String, der festlegt, wie die Datei geöffnet werden soll:
f = File.open("data.txt", "r") # Öffne die Datei data.txt zum Lesen
out = File.open("out.txt", "w") # Öffne die Datei out.txt zum Schreiben
Das zweite Argument von
File.open
ist ein String, der den »Dateimodus« festlegt. Er muss mit einem der Werte in der folgenden Tabelle beginnen. Fügen Sie ein
"b"
an, um unter Windows zu verhindern, dass die Zeilenumbrüche automatisch umgewandelt werden. Bei Textdateien können Sie den Namen einer Zeichensatzkodierung an den Modus-String anhängen. Bei Binärdateien sollten Sie ein
":binary"
anfügen. Das wird in „9.7.2 Streams und Kodierungen“ erläutert.
Modus
Beschreibung
"r"
Öffne zum Lesen. Standardmodus.
"r+"
Öffne zum Lesen und Schreiben. Beginne am Anfang der Datei. Fehler, wenn die Datei nicht existiert.
"w"
Öffne zum Schreiben. Erzeuge eine neue Datei oder setze eine bestehende zurück.
"w+"
Wie
"w"
, aber auch Lesen der Datei ist erlaubt.
"a"
Öffne zum Schreiben, füge aber am Ende der Datei an, wenn die Datei schon vorhanden ist.
"a+"
Wie
"a"
, aber Lesen ist auch erlaubt.
File.open
(aber nicht
File.new
) kann einen Block zugeordnet bekommen. In so einem Fall liefert
File.open
nicht das
File
-Objekt zurück, sondern übergibt es an den Block und schließt es automatisch, wenn der Block verlassen wird. Der Rückgabewert des Blocks wird zum Rückgabewert von
File.open
:
File.open("log.txt", "a") do |log| # Öffne zum Anfügen
log.puts("INFO: Mitteilung loggen") # Ausgabe in die Datei
end # Automatisch geschlossen
9.7.1.2 Kernel.open
Die Methode
open
von
Kernel
funktioniert wie
File.open
, ist aber flexibler. Wenn der Dateiname mit
|
beginnt, wird er als Betriebssystembefehl interpretiert und der zurückgegebene Stream wird zum Lesen aus diesem Befehlsprozess und zum Schreiben in ihn interpretiert. Das ist natürlich plattformabhängig:
# Wie lange läuft der Server schon?
uptime = open("|uptime") {|f| f.gets }
Wenn die Bibliothek
open-uri
geladen wurde, kann
open
auch genutzt werden, um per
http
und
ftp
so aus URLs zu lesen, als ob es sich um Dateien handeln würde:
require "open-uri" # Notwendige Bibliothek
f = open("http://www.davidflanagan.com/") # Webseite als Datei
webpage = f.read # Als einen großen String lesen
f.close # Nicht vergessen zu schließen!
Wenn in Ruby 1.9 das Argument von
open
eine Methode
to_open
besitzt, wird diese Methode aufgerufen, die ein geöffnetes
IO
-Objekt zurückgeben sollte.
9.7.1.3 StringIO
Eine andere Möglichkeit, ein
IO
-Objekt zu erhalten, ist die Verwendung der Bibliothek
stringio
, um einen String zu lesen oder zu schreiben:
require "stringio"
input = StringIO.open("now is the time") # Aus diesem String lesen
buffer = ""
output = StringIO.open(buffer, "w") # In den
Weitere Kostenlose Bücher