本記事では、Golangでファイルを読み込む処理について、具体的なコードを用いて解説します。
ファイルへの書き込みについてはこちらの記事で詳しく解説しています。
読み込むファイルを開く・閉じる
まずは、読み込む対象となるファイルを開く必要があります。
GolangではosパッケージのOpen()関数を使用することで、ファイルの展開ができます。
file, err := os.Open("ファイル名.拡張子")
また、操作終了後は展開したファイルを必ず閉じなければいけないので、deferキーワードを使って、関数の最後にファイルを閉じる処理を実行します。
defer file.Close() // すべての処理が終わった後にファイルを閉じる
Golangでファイルの内容を読み込む方法
Golangでファイルを読む方法はいくつかあり、今回は、一般的で且つ効果的な方法を3つ紹介します。
- 最初にファイル全体を読み込む方法
- ファイルを一行ずつ読み込む方法
- ファイルをチャック単位で読み込む方法
最初にファイル全体を読み込む方法
これが最もシンプルなファイル読み込みの方法です。
例えば、ローカルディレクトリに “sample.txt “というファイルがあり、「このファイルは sample.txt です」という文字列が書かれているとします。
Golangのioutilパッケージを使って、直接ファイルを読み込みます。
ioutilパッケージは、ファイルを読み込んだ後、ファイルが閉じられることを確認します。
そのため、ファイルを閉じないことによるメモリリークを心配する必要はありません。
以下は、ioutilを使用した実装例です。
package main
import (
"fmt"
"io/ioutil"
)
func main() {
fileContent, err := ioutil.ReadFile("sample.txt")
if err != nil {
fmt.Println("Err")
}
fmt.Println(string(fileContent)) // ファイルの内容を出力
}
上記のコードを見ての通り、ファイルの内容を取得した後、文字列に変換する必要があることに注意してください。
出力結果は以下の通りです。
$ go run main.go
このファイルは sample.txt です
このやり方は、大きなファイルを扱う際には効率的な方法とは言えませんが、最もシンプルで簡単な方法です。
そのため、小さなファイルであれば、パフォーマンスの問題を気にすることなく使えるでしょう。
ファイルを一行ずつ読み込む方法
Golangのbufioパッケージを使うと、ファイルを一行ずつ読み込むことが可能です。
例として、以下のsample.txtファイルがあるとします。
上記のファイルの内容を、一行ずつ読み込んで出力するコードは以下のようになります。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println(err)
}
}
出力結果はこのようになり、ファイルの文が一行ずつ表示されます。
$ go run main.go
I like baseball.
I like soccer.
I like banana.
I like cake.
I like coffee.
I like tennis.
I like movie.
ファイルをチャンク単位で読み込む方法
これは、全ての内容を完全にメモリに取り込まず、チャンク単位で読み込むのです。大きなファイルを扱う時、チャンクで読み込むことは、メモリ不足のエラーを回避するために非常に役立ちます。
例として以下のようなsample.txtを読み込むとします。
ファイルの内容をチャンク単位で読み込む処理は以下の通りです。
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println("Error opening file!!!")
}
defer file.Close()
const chunkSize = 10 // チャンク単位を定義
buffer := make([]byte, chunkSize) // バッファを作成
for {
content, err := file.Read(buffer) // バッファに内容を読み込む
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
}
fmt.Println(string(buffer[:content]))
}
}
出力すると次のようになります.
$ go run main.go
I like bas
eball.
I l
ike baseba
ll.
I like
baseball.
I like ba
seball.
I
like baseb
all.
I lik
e baseball
.
I like b
aseball.
I
like base
ball.
Golangでファイルのスタッツを取得する方法
開いたファイルについて、いくつかの統計情報を得ることが可能で、Stat()関数を使用することで取得できます。
Stat()関数はFileInfoオブジェクト(インターフェース)を返します。
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println(err)
}
fmt.Println(file.Stat())
// &{sample.txt 3 420 {495450925 63773504748 0x113e3a0} {16777221 33188 1 11175149 501 20 0 [0 0 0 0] {1637907949 523380622} {1637907948 495450925} {1637907948 495450925} {1637907946 255533120} 3 8 4096 0 0 0 [0 0]}} <nil>