package main
import (
"bufio"
"io"
"io/ioutil"
"log"
"os"
"time"
)
// 一次性读取
func ReadAll(filePth string) ([]byte, error) {
f, err := os.Open(filePth)
if err != nil {
return nil, err
}
defer f.Close()
/*
ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。
成功的调用返回的err为nil而非EOF。
因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误。
*/
return ioutil.ReadAll(f)
}
// 分块读取 可在速度和内存占用之间取得很好的平衡。
func ReadBlock(filePth string, bufSize int, hookfn func([]byte)) error {
f, err := os.Open(filePth)
if err != nil {
return err
}
defer f.Close()
buf := make([]byte, bufSize) //一次读取多少个字节
/*
NewReader创建一个具有默认大小缓冲、从r读取的*Reader。
*/
bfRd := bufio.NewReader(f)
for {
n, err := bfRd.Read(buf)
hookfn(buf[:n]) // n 是成功读取字节数
if err != nil { //遇到任何错误立即返回,并忽略 EOF 错误信息
if err == io.EOF {
return nil
}
return err
}
}
return nil
}
// 输出到控制台
func processTask(line []byte) {
os.Stdout.Write(line)
//fmt.Println(string(line))
}
// 逐行读取
func ReadLine(filePth string, hookfn func([]byte)) error {
f, err := os.Open(filePth)
if err != nil {
return err
}
defer f.Close()
bfRd := bufio.NewReader(f)
for {
line, err := bfRd.ReadBytes('\n')
hookfn(line)
if err != nil {
if err == io.EOF {
return nil
}
return err
}
}
return nil
}
// 文件监控
func FileMonitoring(filePth string, hookfn func([]byte)) {
f, err := os.Open(filePth)
if err != nil {
log.Fatalln(err)
}
defer f.Close()
rd := bufio.NewReader(f)
f.Seek(0, 2)
for {
line, err := rd.ReadBytes('\n')
// 如果是文件末尾不返回
if err == io.EOF {
time.Sleep(500 * time.Millisecond)
continue;
} else if err != nil {
log.Fatalln(err)
}
go hookfn(line)
}
}
func main() {
/*
一次性读取
*/
// 直接读取文件,无需打开句柄
/*
ret,err:=ioutil.ReadFile("/usr/local/nginx/logs/access.log")
if err != nil {
fmt.Println(err)
}
fmt.Println(string(ret))
*/
// 一次性读取
/*
ret, err := ReadAll("/usr/local/nginx/logs/access.log")
if err != nil {
fmt.Println(err)
}
fmt.Println(string(ret))
*/
// 分块读取
/*
ReadBlock("/usr/local/nginx/logs/access.log", 10000, processTask)
*/
// 逐行读取
/*
ReadLine("/usr/local/nginx/logs/access.log", processTask)
*/
// 示例 日志实时监控
FileMonitoring("/usr/local/nginx/logs/access.log", processTask)
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Java实时读取日志文件
- 重磅重构开源 让H5标签代替C++实时解码播放speex压缩协议的音频文件 【IM的福音】
- LearningAVFoundation之拍摄+实时滤镜+实时写入
- 基于实时计算(Flink)与高斯模型构建实时异常检测系统
- 什么是实时计算,实时计算的相关技术主要分为哪几个阶段?
- 实时离线融合在唯品会的进展:在实时技术、数据、业务中寻找平衡
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Verilog数字系统设计教程
夏宇闻 / 北京航空航天大学出版社 / 2003-7-1 / 38.0
《Verilog数字系统设计教程》可作为电子工程类、自动控制类、计算机类的大学本科高年级及研究生教学用书,亦可供其他工程人员自学与参考。一起来看看 《Verilog数字系统设计教程》 这本书的介绍吧!