ローカルファイルからio.Readerを作成します


89

ローカルファイルを開いて、を返したいのio.Readerですが。その理由はio.Reader、次のように、使用しているライブラリにをフィードする必要があるためです。

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

}

1
おそらく周りのいくつかの時間ブラウジングを費やす価値golang.org/pkgと、あなたがやっているように聞こえるもののようなもののために、OS、IO、IO / ioutil、およびBUFIO。
twotwotwo 2014

回答:


117

os.Open を返します 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
(* os.File)がPlaygroundからファイルを開くことができなくてもio.Readerであることを示すためのトリックが大好きです。
twotwotwo 2014

@twotwotwoそのハックは正確に何をしますか。構文的には何もファイルを言っていないので、何も開こうとしないと思います。
mschuett 2015

7
@mschuett多かれ少なかれ:それは。をnil指すのに適切なタイプのポインタですos.File。(この場合、あなたは本当にそれを介して何もすることはできません。)そして、var _ io.Reader = (*os.File)(nil)割り当ては、コンパイラのチェック作る*os.Fileあるio.Reader(または他の割り当てが有効ではないでしょうが)。Playgroundに移動してに変更*os.Fileする*os.Processと、インターフェイスを満たさないものに対して生成されるエラーが表示されます。
twotwotwo 2015

2
@fabrizioMは、ドキュメントの中で* os.FileがReaderを実装していると正確に述べています。そうでなければ、この答えがなければ、公式のドキュメントを読むだけで自分自身を理解することができますか?はい、わかりfunc (f *File) Read(b []byte) (n int, err error)ましたReader。と同じです。
Aliaksandr Kazlou 2015

43

os.Open()を使用します:

func Open(name string)(file * File、err error)

Openは、指定されたファイルを読み取り用に開きます。成功した場合、返されたファイルのメソッドを使用して読み取ることができます。関連するファイル記述子のモードはO_RDONLYです。エラーがある場合は、* PathErrorタイプになります。

typeの戻り値は*os.Fileio.Readerインターフェースを実装します。


27

タイプ* os.Fileはio.Readerインターフェースを実装しているため、ファイルをリーダーとして返すことができます。ただし、次のような大きなファイルを読み取る場合は、bufioパッケージを使用することをお勧めします。

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

return bufio.NewReader(file)

4
bufio大きなファイルをお勧めする理由を詳しく教えてください。
Ciro Costa

1
@CiroCosta Gbsの巨大なファイルがある場合は、メモリ上で完全に読み取りたくないので、そのような場合はバッファを使用する必要があります
Yandry Pozo 2017

賢明な状況などで、外出先のランタイムが使用するバッファio.Copyは、そのインタフェースが利用可能な場合根本的なバッファを再利用します-それ以外の場合は、内部バッファを作成します
colm.anseo

1
ありがとうpath/file.ext。他の答えは何でos.Fileあったかを詳しく説明していません。
Azurespot

5

これは、テキストファイルを開き、返された* os.Fileインスタンスからio.Readerを作成する例です。

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.