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.
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.
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.
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.
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.
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"
)
funcmain() {
f, err := os.Open("somefile.txt")
if err != nil {
panic(err)
}
defer f.Close()
var r io.Reader
r = f
}
Antworten:
os.Open
gibt ein zurückio.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") }
quelle
nil
Zeiger des richtigen Typs, um auf einen zu zeigenos.File
. (In diesem Fall können Sie nichts wirklich tun.) Und dievar _ io.Reader = (*os.File)(nil)
Zuweisung lässt den Compiler prüfen, ob*os.File
es sich um eine handeltio.Reader
(oder die Zuweisung wäre nicht gültig). Wenn Sie zum Spielplatz gehen und zu wechseln*os.File
,*os.Process
wird der Fehler angezeigt, der für Dinge generiert wird, die die Benutzeroberfläche nicht erfüllen.func (f *File) Read(b []byte) (n int, err error)
das genauso wie inReader
.Verwenden Sie os.Open () :
Der zurückgegebene Wert vom Typ
*os.File
implementiert dieio.Reader
Schnittstelle.quelle
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)
quelle
bufio
große Dateien empfehlen ?path/file.ext
. Keine andere Antwort formulierte, wasos.File
war.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 }
quelle