在读取文件时,为什么ReadBytes会影响以下读取?

时间:2015-07-30 23:11:35

标签: go

使用reader.Read按块读取文件时,每次调用时读取32KB 但是如果我使用reader.ReadBytes,它会将下一个reader.Read的读取字节数减少到3KB。

另一个问题:为什么无法我使用reader.Readbufio.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

1 个答案:

答案 0 :(得分:1)

因为它的设计是这样的。读取时可以读取任何字节数。思考reader是一个接口,reader.Read()需要满足所有实现。