从本地文件创建io.Reader


85

我想打开一个本地文件,并返回一个io.Reader。原因是我需要向io.Reader正在使用的库中提供,例如:

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

}

1
可能值得花一些时间在golang.org/pkg上浏览,并且听起来像是在做os,io,io / ioutil和bufio。
twotwotwo 2014年

Answers:


112

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)是io.Reader而无法从Playground打开文件的技巧。
twotwotwo 2014年

@twotwotwo该hack到底做什么。我在语法上假设它是在说什么都没有,所以它从不尝试打开任何东西。
mschuett

7
@mschuett或多或少:这是nil指向的正确类型的指针os.File。(在这种情况下,您实际上无法通过它执行任何操作。)并且该var _ io.Reader = (*os.File)(nil)赋值使编译器检查*os.File是否为io.Reader(否则该赋值将无效)。如果您转到Playground并更改*os.File为Playground,*os.Process则会看到它针对不满足界面要求的东西生成的错误。
twotwotwo

2
@fabrizioM在文档中确切地指出* os.File实现了Reader。否则,如果没有此答案,您如何仅阅读正式文档就能弄清楚自己?好的,我看到func (f *File) Read(b []byte) (n int, err error)的与中的相同Reader
Aliaksandr Kazlou,2015年

42

使用os.Open()

func Open(名称字符串)(文件*文件,错误错误)

打开将打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取。关联的文件描述符的模式为O_RDONLY。如果有错误,它将是* PathError类型。

类型的返回值*os.File实现io.Reader接口。


26

* os.File类型实现io.Reader接口,因此您可以将文件作为Reader返回。但是,如果您打算读取大文件,我建议您使用bufio软件包,如下所示:

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

return bufio.NewReader(file)

4
您能否详细说明为什么建议bufio使用大文件?
西罗科斯塔

1
@CiroCosta如果您有巨大的Gbs文件,您不想完全在内存中读取它,因此对于这些情况,我们应该使用缓冲区
Yandry Pozo

go的运行时在合理的情况下使用缓冲区,例如io.Copy将在底层缓冲区可用时重用底层缓冲区-否则它将创建内部缓冲区
colm.anseo,

1
谢谢你path/file.ext。没有其他答案说明了什么os.File
Azurespot,

5

这是一个示例,其中我们打开一个文本文件并从返回的* os.File实例f创建一个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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.