大佬们,遇到一个关于读取文件的奇怪现象
我在使用os.OpenFile,file.Read读取文件的时候,缓冲区为4MB,偶尔会遇到读取不满缓冲区的情况,而且并没有读到文件末尾,但是就是读取不满整个4MB,代码如下
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
}
下面整个图是上面的代码调试的结果
parSeq是文件按照4MB划分成几块
seq是现在读取的是第几块文件
可以看到在读取第一块文件的时候,只读到了2759533个字节,但是整个chunk有4MB
后面想着使用ReadAt方法循环读写,直到读取满缓存区或者EOF,还是有一样的问题,读取不满整个缓冲区,直接死循环在那了。有时候一个文件有37个字节,但是一直只读取到20个字节
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
}
}
想请教各位大佬遇到过这种问题吗
有疑问加站长微信联系(非本文作者)

后面的循环读数据有问题 每次读取都会覆盖之前的内容 而且每次读取的n也没有增加 所以会死循环
没遇到过这种问题,只有两种情况,要么读取到b大小的数据,要么遇到EOF
建议你写个demo看看