Golang 实现简单的滚动读取文本更新

YaoDD · · 2600 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

      这个小程序要实现的效果,简单地说,就是将目标文件的内容读取输出到终端,并且目标文件并不是静态的,而是随时会添加新的内容。我们的目标就是一旦目标文件添加了新的内容,就把它读取出来并且显示到终端上。

     实现方法很简单,用一个变量offset标记已经读到了文件的哪个位置,每次循环开始前就将读指针指到相应位置。这里有两个tricky的地方需要注意,我们在每次循环的时候都要重复地打开和关闭文件,否则文件有更新也读不出来。当我们读到文件末尾时,会多读出一个字符(文件结束标识符?)。具体的实现如下:

 

package main

import (
	"fmt"
	"io"
	"os"
	"time"
)

func main() {
	file := os.Args[1]
	buf := make([]byte, 1024)
	offset := 0

	f, err := os.Open(file)
	defer f.Close()
	if err != nil {
		fmt.Printf("open file %s failed: %v\n", file, err)
		return
	}

	for {
		n, err := f.Read(buf)
		if err != nil && err != io.EOF {
			fmt.Printf("read file %s failed: %v\n", file, err)
			return
		}
		if n > 1 {
			if n != len(buf) {
				n--
			}
			fmt.Printf("%s", string(buf[:n]))
			offset += n
		}

		if n != len(buf) {
			time.Sleep(1 * time.Second)
			f.Close()
			f, err = os.Open(file)
			if err != nil {
				fmt.Printf("open file %s failed: %v\n", file, err)
				return
			}
			f.Seek(int64(offset), 0)
		}
	}

}

  

  

  


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

本文来自:博客园

感谢作者:YaoDD

查看原文:Golang 实现简单的滚动读取文本更新

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

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