File.open("demo") { |file| file.readlines }
# äquivalent
readlines("demo")
Während die Methode readlines die Datei komplett einliest
und ein Array mit den einzelnen Zeilen zurückliefert, kann eine
Datei auch zeilenweise bearbeitet werden. Welches Verfahren gewählt
wird, hängt davon ab, ob eine hohe Geschwindigkeit wichtiger ist
(readlines) oder eher eine geringe Speichernutzung wie beim
nächsten Beispiel:
File.open("demo") { |file|
while file.gets
print $_ if /Ruby/
end
}
Die Methode File#gets liefert nil, wenn das Dateiende
erreicht ist, so dass die Schleife abbricht. Die ansonsten
gleichwertige Methode readline erzeugt einen EOFError.
Es gibt auch noch Iteratoren-Varianten für diese Prozedur, die solche Details verbergen:
File.open("demo") { |file|
file.each_line { |line|
print line if line =~ /Ruby/
end
}
# oder auch
File.open("demo").each { |line|
print line if line =~ /Ruby/
}
# oder auch
File.foreach("demo") { |line|
print line if line =~ /Ruby/
}
Binäre Dateien kann man mit der Methode
each_byte Byte für Byte einlesen.
Ab Version 1.7
kann man
für einzelne IO-Streams jeweils ein eigenes Encoding-Schema
setzen:
f = open("file-in-utf8")
f.encoding = "utf-8"
s = f.readline
puts s.encoding
puts s[0]
f.close