使用reader.Read
按块读取文件时,每次调用时读取32KB
但是如果我使用reader.ReadBytes
,它会将下一个reader.Read
的读取字节数减少到3KB。
另一个问题:为什么无法我使用reader.Read
和bufio.NewReaderSize
阅读超过32KB的内容?
我的代码:
func SomeFunc () {
gzfile , err := os.Open(SomeFile)
ErrorPanic (err)
input_file , err := gzip.NewReader(gzfile)
ErrorPanic (err)
// reader := bufio.NewReaderSize(input_file, 120 * 1024 * 1024) //120MB
reader := bufio.NewReader(input_file)
.....
eof := false
for !eof {
var n int
// line := make ([]byte,100 * 1024 * 1024) //100MB
line := make ([]byte,32 * 1024) //32KB
n , err = reader.Read (line)
eof = is_eof (err)
_ , err = buffer.Write (line)
/***/ fmt.Println("len (line)= " , len (line) , " ; n= ",n)
line = []byte{}
ErrorNotice (err)
eos := false
for !eof && !eos {
line , err = reader.ReadBytes('\n')
eof = is_eof (err)
if SomeCond {
.....
buffer.Reset()
eos = true
}
_ , err = buffer.Write (line)
ErrorNotice (err)
}
}
}
func ErrorPanic(err error) .....
func ErrorNotice (err error) .....
func is_eof (err error) bool .....
调用ReadBytes('\n')
时的输出:
len (line)= 32768 ; n= 32768
len (line)= 32768 ; n= 3782
len (line)= 32768 ; n= 2966
len (line)= 32768 ; n= 2835
len (line)= 32768 ; n= 2756
len (line)= 32768 ; n= 3513
len (line)= 32768 ; n= 2583
len (line)= 32768 ; n= 3247
不调用ReadBytes('\n')
时的输出:
len (line)= 32768 ; n= 32768
len (line)= 32768 ; n= 32768
len (line)= 32768 ; n= 32768
答案 0 :(得分:1)
因为它的设计是这样的。读取时可以读取任何字节数。思考reader
是一个接口,reader.Read()
需要满足所有实现。