로컬 파일에서 io.Reader 만들기


85

로컬 파일을 열고 io.Reader. 그 이유는 io.Reader다음과 같이 사용중인 라이브러리에 a 를 공급해야하기 때문입니다 .

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

}

1
아마도 golang.org/pkg를 둘러 보는 데 시간을 할애 할 가치가 있을 것입니다. 그리고 여러분이하고있는 것처럼 들리는 경우에는 os, io, io / ioutil 및 bufio가 있습니다.
twotwotwo 2014 년

답변:


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
Heh, (* 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(그렇지 않으면 할당이 유효하지 않음) 확인하도록합니다. 당신이 놀이터에 가서 변경하는 경우 *os.File*os.Process당신이 인터페이스를 만족하지 않는 것들에 대해 생성하는 오류를 볼 수 있습니다.
twotwotwo 2015

2
@fabrizioM 여기서 정확히 문서에서 * os.File은 리더를 구현한다고 말합니다. 그렇지 않으면이 대답이 없으면 공식 문서를 읽는 것만으로도 자신을 파악할 수 있습니까? 좋아, 나는 func (f *File) Read(b []byte) (n int, err error)에서와 같은 것을 본다 Reader.
Aliaksandr Kazlou

42

사용 os.Open () :

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

열기는 읽기 위해 명명 된 파일을 엽니 다. 성공하면 반환 된 파일의 메서드를 사용하여 읽을 수 있습니다. 연관된 파일 설명자는 O_RDONLY 모드를 갖습니다. 오류가 있으면 * PathError 유형이됩니다.

반환 된 type 값은 인터페이스를 *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대용량 파일 을 권장하는 이유에 대해 자세히 설명해 주 시겠습니까?
Ciro Costa

1
당신의 GBS 큰 파일이있는 경우 @CiroCosta 그렇게하는 경우에 우리는 버퍼를 사용한다, 메모리에 완전히 읽을 수 없다
Yandry 포조

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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.