现在有大文件,大约1GB。想打印第2w-3w字节的数据。
如果你能想到一下子比读到内存更好的办法,就不用看这篇文章了。
- 一段不明所以的代码
- 真正的英雄函数
- 留下疑问
- github 完整代码
一段不明所以的代码
func sliceFile(rs io.ReadSeeker, w io.Writer, start, end int) error {
if start < 0 {
return fmt.Errorf("invalid start argument: %d", start)
}
if end < 0 {
return fmt.Errorf("invalid end argument: %d", end)
}
if end < start {
return fmt.Errorf("invalid start:end argument: [%d, %d]", start, end)
}
//
_, err := rs.Seek(int64(start), 0)
if err != nil {
return err
}
canRead := end - start
// buf大小可以调整,为了测试方便调小一点
readBuf := make([]byte, 8)
for canRead > 0 {
needRead := len(readBuf)
if needRead > canRead {
needRead = canRead
}
n, err := rs.Read(readBuf[:needRead])
if err != nil {
break
}
w.Write(readBuf[:n])
canRead -= n
}
return nil
}
真正的英雄函数
请看第一个注释下面的函数,就是它。
疑问
普通文件用上面的函数可以使用,如果输入是os.Stdin怎么办?
github代码示例
后记
在用golang实现linux head 和 tail命令有感而发。感兴趣的可以移步观看
coreutils这个项目,目前已经是全github最全的,用golang语言重写linux 命令项目
有疑问加站长微信联系(非本文作者)