LoginSignup
1
2

More than 3 years have passed since last update.

[Go] ファイルの読み込み方法

Last updated at Posted at 2020-06-07

ファイルの読み込む方法が色々あったので、まとめる

前準備: sample.txt の作成

https://www.lipsum.com/feed/html から:

  • 5 paragraphs
  • 417 words
  • 2777 byte

の Lorem Ipsum 文字を取得し保存しておく。
この sample.txt を読み込んでいく

ioutil.ReadFile で一括読み込み

  • シグネチャ: func ReadFile(filename string) ([]byte, error)

一番簡単に読み込める。
ただ、一度に全部読み込んでメモリに入れるので、ファイルが大きい場合にはお勧めしない。

func main() {
    data, err := ioutil.ReadFile("./sample.txt")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(data))
}

os.Open 後に ioutil.ReadAll で一括読み込み

  • シグネチャ: func Open(name string) (*File, error)
  • シグネチャ: func ReadAll(r io.Reader) ([]byte, error)
func main() {
    file, err := os.Open("./sample.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    data, err := ioutil.ReadAll(file)
    fmt.Printf("Data: %s", data)
}

io.Copy で読み込む

シグネチャ: func Copy(dst Writer, src Reader) (written int64, err error)

こちらの記事 (英文) では、一括すべてを読み込む ioutil.ReadAll より 32kb づつしか読み込まないこっちをお勧めしている。

func main() {
    file, err := os.Open("./sample.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    if _, err := io.Copy(os.Stdout, file); err != nil {
        log.Fatal(err)
    }
}

os.Open 後に指定 byte 分をループで読み込む

シグネチャ: func (f *File) Read(b []byte) (n int, err error)

func main() {

    const BUFFSIZE = 10

    file, err := os.Open("./sample.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    r := make([]byte, BUFFSIZE)

    for {
        n, err := file.Read(r)
        fmt.Printf("%d bytes: %s\n", n, string(r[:n]))
        if err == io.EOF {
            break
        }
    }
}

ファイル最後は err == io.EOF となる。それまでループすれば、全部読めることになる。

bufio.Reader で読み込む

シグネチャ: func NewReader(rd io.Reader) *Reader

バッファ IO を使うので、パフォーマンスよく読み込めるらしい。。

func main() {

    const BUFFSIZE = 10

    file, err := os.Open("./sample.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    r := bufio.NewReader(file)
    b, err := r.Peek(BUFFSIZE)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s bytes: %s\n", strconv.Itoa(BUFFSIZE), string(b))
}

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2