2015-07-30 2 views
0

При чтении файла кусками, используя reader.Read, он считывает 32 КБ для каждого вызова.
Но если я использую reader.ReadBytes, он уменьшает количество прочитанных байтов следующим reader.Read до 3KB.При чтении файла, почему ReadBytes влияет на следующее чтение?

Другой вопрос: почему не я могу читать больше, чем 32KB использованием reader.Read и bufio.NewReaderSize?

Мой код:

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 
+4

Метод 'Read'' 'iio.Reader' позволяет возвращать как можно меньше байтов:' Read (p [] byte) (n int, ошибка err) 'может возвращать любое' n' такое, что '0 <= n <= len (p)'; разрешено использовать [фазу луны] (https://www.freebsd.org/cgi/man.cgi?query=pom&sektion=6), чтобы решить, сколько байтов будет возвращено на любой данный вызов, если захочет. Вам нужно проверить, сколько байтов возвращается (например, 'line = line [: n]' перед его использованием), или если вам требуется определенная сумма, используйте что-то вроде ['io.ReadFull'] (https://golang.org/упак/ю/# ReadFull). –

ответ

1

Потому что он предназначен, как это. При чтении может считываться количество байтов. мышление reader - это интерфейс, а reader.Read() нужно удовлетворить всем требованиям.

Смежные вопросы