ファイルの読み込む方法が色々あったので、まとめる
前準備: 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))
}