求助,关于读取文件的问题

scSZn · · 1464 次点击 · 开始浏览    置顶

大佬们,遇到一个关于读取文件的奇怪现象<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> 想请教各位大佬遇到过这种问题吗

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

1464 次点击  
加入收藏 微博
2 回复  |  直到 2022-04-13 16:12:06
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传