大佬们,遇到一个关于读取文件的奇怪现象<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
![image.png](https://static.golangjob.cn/220406/b4df85aeccd83a4cb4fa673cd6f064c5.png)
<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>
想请教各位大佬遇到过这种问题吗