Yerel bir dosyadan bir io.Reader oluşturun


89

Yerel bir dosya açmak ve bir io.Reader. Bunun nedeni, kullandığım io.Readerbir kitaplığa a beslemem gerekmesidir , örneğin:

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

}

1
Muhtemelen golang.org/pkg ve yaptığınız gibi görünen bir şey için os, io, io / ioutil ve bufio'da gezinmek için biraz zaman harcamaya değer .
twotwotwo

Yanıtlar:


117

os.Open döndürür 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")
}

30
Heh, (* os.File) dosyasının Oyun Alanından dosyaları açamadan bir io.Reader olduğunu gösterme numarasına bayıldım.
twotwotwo

@twotwotwo bu hack tam olarak ne yapıyor? Sözdizimsel olarak hiçbir şey içeren bir dosya söylemediğini varsayıyorum, bu yüzden hiçbir şey açmaya çalışmaz.
mschuett

7
@mschuett Daha çok veya daha az: nilbir os.File. (Bu durumda, gerçekten. İçinden bir şey yapamaz) Ve var _ io.Reader = (*os.File)(nil)atama derleyici kontrol yapar *os.Filebir olduğu io.Reader(veya başka atama geçerli olmaz). Eğer Oyun gidip değiştirirseniz *os.Fileiçin *os.Processsize o arabirimini tatmin olmayan şeyler için üretir hata görürsünüz.
twotwotwo

2
@fabrizioM belgelerde tam olarak nerede * os.File'ın bir Reader uyguladığını söylüyor. Aksi takdirde, bu cevap olmadan kendinizi resmi bir dokümanı okuyarak nasıl anlayabilirsiniz? Tamam, görüyorum func (f *File) Read(b []byte) (n int, err error), aynısı Reader.
Aliaksandr Kazlou

43

Os.Open () kullanın :

func Open (ad dizesi) (dosya * Dosya, hata hatası)

Aç, adlandırılmış dosyayı okumak için açar. Başarılı olursa, döndürülen dosyadaki yöntemler okumak için kullanılabilir; ilişkili dosya tanımlayıcı O_RDONLY moduna sahiptir. Bir hata varsa, * PathError türünde olacaktır.

Tipin döndürülen değeri arabirimi *os.Fileuygular io.Reader.


27

* Os.File türü io.Reader arayüzünü uygular, böylece dosyayı Reader olarak döndürebilirsiniz. Ancak , büyük dosyaları okumak gibi bir niyetiniz varsa bufio paketini kullanmanızı tavsiye ederim.

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

return bufio.NewReader(file)

4
Neden bufiobüyük dosyalar için önerdiğinizi açıklar mısınız?
Ciro Costa

1
@CiroCosta büyük bir Gbs dosyanız varsa, onu tamamen bellekte okumak istemezsiniz, bu nedenle bu durumlarda bir arabellek kullanmalıyız
Yandry Pozo

go'nun çalışma zamanı mantıklı durumlarda arabellekleri kullanır, örneğin io.Copy , arayüzleri mevcutsa temeldeki arabellekleri yeniden kullanır - aksi takdirde dahili bir arabellek oluşturur
colm.anseo

1
İçin teşekkürler path/file.ext. Başka hiçbir cevap ne os.Fileolduğunu açıklamadı.
Azurespot

5

İşte bir metin dosyası açtığımız ve döndürülen * os.File örneğinden bir io.Reader oluşturduğumuz bir örnek f

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.