Erstellen Sie einen io.Reader aus einer lokalen Datei

85

Ich möchte eine lokale Datei öffnen und eine zurückgeben io.Reader. Der Grund dafür ist, dass ich io.Readereine Bibliothek, die ich verwende, mit einem Feed versehen muss , z.

func read(r io.Reader) (results []string) {

}
Xi 张 张
quelle
1
Es lohnt sich wahrscheinlich, ein wenig Zeit damit zu verbringen, in golang.org/pkg zu stöbern, und für die Art von Dingen, die sich so anhören, als würden Sie das Betriebssystem, io, io / ioutil und bufio verwenden.
Zwei

Antworten:

112

os.Open gibt ein zurück io.Reader

http://play.golang.org/p/BskGT09kxL

package main

import (
    "fmt"
    "io"
    "os"
)

var _ io.Reader = (*os.File)(nil)

func main() {
    fmt.Println("Hello, playground")
}
fabrizioM
quelle
30
Heh, ich liebe den Trick, um zu zeigen, dass (* os.File) ein io.Reader ist, ohne Dateien vom Spielplatz aus öffnen zu können.
Zwei
@twotwotwo was genau macht dieser Hack. Ich gehe syntaktisch davon aus, dass es sich um eine Datei mit nichts handelt, sodass niemals versucht wird, etwas zu öffnen.
Mschuett
7
@mschuett Mehr oder weniger: Es ist ein nilZeiger des richtigen Typs, um auf einen zu zeigen os.File. (In diesem Fall können Sie nichts wirklich tun.) Und die var _ io.Reader = (*os.File)(nil)Zuweisung lässt den Compiler prüfen, ob *os.Filees sich um eine handelt io.Reader(oder die Zuweisung wäre nicht gültig). Wenn Sie zum Spielplatz gehen und zu wechseln *os.File, *os.Processwird der Fehler angezeigt, der für Dinge generiert wird, die die Benutzeroberfläche nicht erfüllen.
Zweiundzwanzig
2
@fabrizioM wo genau in der Dokumentation steht, dass * os.File einen Reader implementiert. Andernfalls, ohne diese Antwort, wie könnten Sie sich selbst herausfinden, wenn Sie nur ein offizielles Dokument lesen? Ok, ich sehe func (f *File) Read(b []byte) (n int, err error)das genauso wie in Reader.
Aliaksandr Kazlou
42

Verwenden Sie os.Open () :

func Open (Namenszeichenfolge) (Datei * Datei, Fehler)

Öffnen öffnet die benannte Datei zum Lesen. Bei Erfolg können Methoden für die zurückgegebene Datei zum Lesen verwendet werden. Der zugehörige Dateideskriptor hat den Modus O_RDONLY. Wenn ein Fehler auftritt, ist er vom Typ * PathError.

Der zurückgegebene Wert vom Typ *os.Fileimplementiert die io.ReaderSchnittstelle.

ANisus
quelle
26

Der Typ * os.File implementiert die io.Reader-Schnittstelle, sodass Sie die Datei als Reader zurückgeben können. Ich empfehle Ihnen jedoch, das bufio- Paket zu verwenden, wenn Sie beabsichtigen, große Dateien zu lesen.

file, err := os.Open("path/file.ext")
// if err != nil { ... }

return bufio.NewReader(file)
Yandry Pozo
quelle
4
Könnten Sie bitte erläutern, warum Sie bufiogroße Dateien empfehlen ?
Ciro Costa
1
@CiroCosta Wenn Sie eine riesige Datei von Gbs haben, möchten Sie sie nicht vollständig im Speicher lesen, also sollten wir für diese Fälle einen Puffer verwenden
Yandry Pozo
Die Laufzeit von go verwendet Puffer in sinnvollen Situationen, z. B. io.Copy verwendet zugrunde liegende Puffer wieder, wenn ihre Schnittstelle verfügbar ist. Andernfalls wird ein interner Puffer erstellt
colm.anseo
1
Danke für path/file.ext. Keine andere Antwort formulierte, was os.Filewar.
Azurespot
5

Hier ist ein Beispiel, in dem wir eine Textdatei öffnen und einen io.Reader aus der zurückgegebenen * os.File-Instanz f erstellen

package main

import (
    "io"
    "os"
)

func main() {
    f, err := os.Open("somefile.txt")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    var r io.Reader
    r = f
}
Raumhalter
quelle