大佬们,遇到一个关于读取文件的奇怪现象<br> 我在使用os.OpenFile,file.Read读取文件的时候,缓冲区为4MB,偶尔会遇到读取不满缓冲区的情况,而且并没有读到文件末尾,但是就是读取不满整个4MB,代码如下 ```golang file, err := os.OpenFile(filename, os.O_RDONLY, 0644) if err != nil { baseLogger.WithError(err).WithField("filename", filename).Error("open file fail") return err } defer file.Close() chunk := make([]byte, consts.Size4MB) n, err := file.Read(chunk) if err != nil && err != io.EOF { baseLogger.WithError(err).WithField("filename", filename).Error("read file fail") return err } ``` 下面整个图是上面的代码调试的结果<br> parSeq是文件按照4MB划分成几块 seq是现在读取的是第几块文件 可以看到在读取第一块文件的时候,只读到了2759533个字节,但是整个chunk有4MB  <br> <br> 后面想着使用ReadAt方法循环读写,直到读取满缓存区或者EOF,还是有一样的问题,读取不满整个缓冲区,直接死循环在那了。有时候一个文件有37个字节,但是一直只读取到20个字节 ```golang chunk := byte_pool.DefaultBytePool.Get() var n int var err error for n < consts.Size4MB && err != io.EOF { var offset = int64(seq) * consts.Size4MB n, err = file.ReadAt(chunk, offset) if err != nil && err != io.EOF { baseLogger.WithError(err).WithField("filename", filename).Error("read file fail") sendGroup.Cancel() return err } // 如果是最后一块,不满足整个块 if int64(n) == size-offset { break } } ``` <br> <br> <br> 想请教各位大佬遇到过这种问题吗
有疑问加站长微信联系(非本文作者)
