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

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

------注:文件末尾的最后一个字符并不是文件描述符,其实就是一个简单的'\n',一般用"echo"命令或者"vim"编写文件时,就会在末尾自动添加。

方法一:独立实现

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)
}
} }

  

方法二:实现io.Reader接口,装饰bufio库

package main

import (
"os"
"bufio"
"time"
"io"
"fmt"
) type fileReader struct {
file string
offset int64
} func (f *fileReader) Read(p []byte) (n int, err error) {
reader, err := os.Open(f.file)
defer reader.Close()
if err != nil {
return 0, err
}
reader.Seek(f.offset, 0) n, err = reader.Read(p) if err == io.EOF {
time.Sleep(1 * time.Second)
}
f.offset += int64(n) return n, err
} func main() {
file := &fileReader{os.Args[1], 0}
br := bufio.NewReader(file) for {
log, _, err := br.ReadLine() if err == io.EOF {
continue
} if err != nil {
fmt.Printf("err: %v", err)
return
} fmt.Printf("%s\n", string(log))
}
}

  

  

Golang 实现简单的滚动读取文本更新的更多相关文章

  1. Golang的交互模式进阶-读取用户的输入

    Golang的交互模式进阶-读取用户的输入 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 读写数据除了 fmt 和 os 包,我们还需要用到 bufio 包来处理缓冲的输入和输出. ...

  2. [转载]MongoDB学习 (四):创建、读取、更新、删除(CRUD)快速入门

    本文介绍数据库的4个基本操作:创建.读取.更新和删除(CRUD). 接下来的数据库操作演示,我们使用MongoDB自带简洁但功能强大的JavaScript shell,MongoDB shell是一个 ...

  3. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  4. 【Android】12.5 利用Intent读取和更新通讯录

    分类:C#.Android.VS2015: 创建日期:2016-02-23 修改日期:2016-03-08更正了未关闭cursor的bug.  一.简介 本节演示如何在安卓系统中通过用户配置文件(us ...

  5. hystrix(一) 简单使用, 以及动态配置更新

    本文转载自https://my.oschina.net/u/1169457/blog/1787414 hystrix 简单使用, 以及动态配置更新 概述 只介绍同步模式下简单的使用, 有助于快速接入, ...

  6. 使用一行Python代码从图像读取文本

    处理图像不是一项简单的任务.对你来说,作为一个人,很容易看着某样东西然后马上知道你在看什么.但电脑不是这样工作的. 对你来说太难的任务,比如复杂的算术,或者一般意义上的数学,是计算机毫不费力就能完成的 ...

  7. Python读取文本,输出指定中文(字符串)

    因业务需求,需要提取文本中带有检查字样的每一行. 样本如下: 1 投入10kVB.C母分段820闭锁备自投压板 2 退出10kVB.C母分段820备投跳803压板 3 退出10kVB.C母分段820备 ...

  8. C#读取文本播放相应语音【转】

    第一种方案: 利用微软text to speech引擎(TTS),读取文本 (1)添加Microsoft Speech Object Library的项目引用 (2)引入using SpeechLib ...

  9. TEXT文本编辑框4 点击按钮读取文本框内容到内表

    *&---------------------------------------------------------------------* *& Report ZTEST_CWB ...

随机推荐

  1. 常用SQL查询语句

    一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ...

  2. Angularjs,WebAPI 搭建一个简易权限管理系统 —— 系统业务与实现(三)

    目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 系统业务与实现(二) 上一章我们讲解的 Angu ...

  3. Intellij idea开发Hadoop MapReduce程序

    1.首先下载一个Hadoop包,仅Hadoop即可. http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0 ...

  4. web安全——系统(Linux)

    简介 最小(少)原则,是安全的重要原则.最小的权限,最小的用户,最少的服务,最少的进程,是最安全的. 系统安全包括:文件系统保护.用户管理安全.进程的保护以及日志的管理. 场景 确保服务最少,每个都是 ...

  5. 类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内。

    错误的写法:  if (this.GridView1.Rows.Count > 0)         {             string style = @"<style& ...

  6. Force.com微信开发系列(四)申请Access Token及自定义菜单之创建菜单

    在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介 ...

  7. IOS中程序如何进行推送消息(本地推送,远程推送)2(上)

    未看过本地推送的,可以提前看一下本地推送. http://www.cnblogs.com/wolfhous/p/5135711.html =============================== ...

  8. IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)

    目录 IP协议首部格式地址解析协议 ARP逆向地址解析协议 RARP网际控制报文协议 ICMP网际组管理协议IGMP IP 数据报首部 IP数据报首部格式: 最高位在左边,记为0 bit:最低位在右边 ...

  9. C++pair类型

    标准库类型--pair类型定义在utility头文件中定义 本文地址:http://www.cnblogs.com/archimedes/p/cpp-pair.html,转载请注明源地址. 1.pai ...

  10. Maven学习——安装与修改Maven的本地仓库路径

    一.Maven的下载安装配置 1.1.下载 官网 http://maven.apache.org/download.cgi 1.2.安装配置 apache-maven-3.3.3-bin.zip 解压 ...