bufio
는 io
의 reader
writer
의 버퍼링을 지원하는 래핑하는 타입 입니다.
기본적으로 os
패키지의 파일 입출력은 버퍼가 없는 저수준 입출력 입니다. 이는 큰 용량의 파일을 처리할 때 큰 부하를 일으킵니다.
bufio
를 사용하면 버퍼를 활용해 하드웨어 부담을 줄일 수 있습니다.
func main() {
veryBigFile, _ := os.Open("test")
bufedReader := bufio.NewReader(veryBigFile)
d := make([]byte, 2048)
bufedReader.Read(d)
}
bufio
의 기본 버퍼 사이즈는 4096byte
입니다.
const (
defaultBufSize = 4096
)
만약 버퍼 사이즈를 직접 지정하려면 다음처럼 하면 됩니다.
bufedReader := bufio.NewReaderSize(veryBigFile, 256)
bufio.Reader
테스트 데이터
bufed Reader 는 다음 함수로 생성 합니다.
bufedReader := bufio.NewReader(veryBigFile)
// 버퍼 사이즈 지정
bufedReader := bufio.NewReaderSize(veryBigFile, 256)
기본적인 Reader
구현 함수는 아래를 참고해 주세요
func (b *Reader) Buffered() int
버퍼의 저장된 데이터 사이즈를 리턴 합니다.
func main() {
veryBigFile, _ := os.Open("test")
bufedReader := bufio.NewReaderSize(veryBigFile, 256)
d := make([]byte, 16)
bufedReader.Read(d)
fmt.Printf("%s\n", d)
println(bufedReader.Buffered())
}
hello how are yo
240
func (b *Reader) Discard(n int) (discarded int, err error)
입력받은 길이만큼 버퍼의 데이터를 생략 하고 생략한 길이를 리턴 합니다.
func main() {
veryBigFile, _ := os.Open("test")
bufedReader := bufio.NewReaderSize(veryBigFile, 256)
d := make([]byte, 8)
bufedReader.Read(d)
fmt.Printf("%s\n", d)
bufedReader.Discard(2)
bufedReader.Read(d)
fmt.Printf("%s\n", d)
}
hello ho
are you
func (b *Reader) Peek(n int) ([]byte, error)
offset
과 원본 Reader
의 변화 없이 버퍼의 값을 입력 받은 크기 만큼 읽어옵니다.
func main() {
veryBigFile, _ := os.Open("test")
bufedReader := bufio.NewReaderSize(veryBigFile, 256)
d := make([]byte, 8)
peeked, _ := bufedReader.Peek(8)
fmt.Printf("%s\n", peeked)
bufedReader.Read(d)
fmt.Printf("%s\n", d)
}
hello ho
hello ho
func (b *Reader) Read(p []byte) (n int, err error)
입력받은 b
에 b
사이즈 만큼 버퍼를 읽습니다.
func (b *Reader) ReadBytes(delim byte) ([]byte, error)
버퍼를 읽어서 처음부터 delim
문자까지 읽어 리턴 합니다.
func main() {
veryBigFile, _ := os.Open("test")
bufedReader := bufio.NewReaderSize(veryBigFile, 256)
d, _ := bufedReader.ReadBytes(byte('o'))
fmt.Printf("%s\n", d)
}
hello
func (b *Reader) ReadString(delim byte) (string, error)
버퍼를 읽어서 처음부터 delim
문자까지 읽어 리턴 합니다. string
타입으로 리턴 합니다.
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
버퍼를 \n
또는 \r\n
까지 읽습니다. 리턴된 값에는 개행 문자가 포함되지 않습니다. 리턴된 line
이 개행문자까지 읽지 못했을 경우, isPrefix
는 true
로 리턴 됩니다.
func (b *Reader) Size() int
버퍼 사이즈를 리턴 합니다.
func (*Reader) Reset
입혁한 Reader
로 버퍼를 초기화 합니다.
bufio.Writer
Writer
는 아래처럼 생성 합니다.
bufedWriter := bufio.NewWriter(f)
// 버퍼 사이즈 지정
bufedWriter := bufio.NewWriterSize(f, 256)
func (b *Writer) Available() int
남은 버퍼의 크기를 리턴합니다.
func (b *Writer) Buffered() int
버퍼에 저장된 데이터 크기를 리턴합니다.
func (b *Writer) Flush() error
버퍼의 모든 데이터를 원본 Writer
에 전송하고 버퍼를 비웁니다.
func (b *Writer) ReadFrom(r io.Reader) (n int64, err error)
입력 받은 Reader
의 값을 읽어, 버퍼에 저장합니다.
func (b *Writer) Reset(w io.Writer)
버퍼의 Writer
를 입력받은 값으로 리셋합니다.
func (b *Writer) Size() int
버퍼 사이즈를 리턴합니다.
func (b *Writer) Write(p []byte) (nn int, err error)
버퍼에 입력받은 값을 작성합니다.
func main() {
f, _ := os.Create("test")
bufedWriter := bufio.NewWriter(f)
bufedWriter.Write([]byte("hi hello"))
bufedWriter.Flush()
}
test 파일
hi hello
func (b *Writer) WriteByte(c byte) error
입력받은 바이트를 버퍼에 작성합니다.
func (b *Writer) WriteRune(r rune) (size int, err error)
입력받은 rune
을 버퍼에 작성합니다.
func (b *Writer) WriteString(s string) (int, error)
입력받은 문자열을 버퍼에 작성합니다.