Öffnen Sie einen E / A-Stream aus einer lokalen Datei oder URL

104

Ich weiß, dass es Bibliotheken in anderen Sprachen gibt, die eine Zeichenfolge, die entweder einen Pfad zu einer lokalen Datei oder eine URL enthält, als lesbaren E / A-Stream öffnen können.

Gibt es eine einfache Möglichkeit, dies in Rubin zu tun?

csexton
quelle

Antworten:

224

open-uri ist Teil der Standard-Ruby-Bibliothek und definiert das Verhalten neu, opensodass Sie sowohl eine URL als auch eine lokale Datei öffnen können. Es gibt ein FileObjekt zurück, daher sollten Sie in der Lage sein, Methoden wie readund aufzurufen readlines.

require 'open-uri'
file_contents = open('local-file.txt') { |f| f.read }
web_contents  = open('http://www.stackoverflow.com') {|f| f.read }
Aaron Hinni
quelle
2
Gibt es eine Möglichkeit, ein Dateiobjekt wie hier aus einem ActionMailer-Anhang zurückzugeben?
AnApprentice
9
Wisse, dass dies jetzt ein bisschen alt ist, aber du kannst auch:content = open("http://example.com").read
Automatico
6
Sie können dies tun, aber wenn Sie dies außerhalb des Abschlusses tun, bleibt der Dateideskriptor geöffnet. Dies kann bei einigen Anwendungen ein Problem sein.
Aaron Hinni
19
Beachten Sie, dass eine Datei open-urinicht gestreamt wird, sodass Sie die ersten 4 KB nicht lesen können. open-uriliest beim Öffnen eine ganze Datei in den Speicher.
zed_0xff
3
URI.parse('http://www.stackoverflow.com').open { |f| f.read }Wenn Sie nach einer Möglichkeit suchen, sich zu versichern, ruft es nicht an Kernal.open. Kommt auch um Rubocop-Sicherheitsregeln herum.
Newdark-It