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)与高斯模型构建实时异常检测系统
- 什么是实时计算,实时计算的相关技术主要分为哪几个阶段?
- 实时离线融合在唯品会的进展:在实时技术、数据、业务中寻找平衡
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
零基础学Java Web开发
刘聪 编 / 机械工业出版社 / 2008-1 / 59.00元
《零基础学Java Web开发:JSP+Servlet+Sfruts+Spring+Hibernte》全面讲解Java Web应用开发的编程技术,并详细介绍Java Web开发中各种常用的技术,可作为Java Web开发技术的学习指南。 《零基础学Java Web开发:JSP+Servlet+Sfruts+Spring+Hibernte》共17章,分为3篇,其中第1~12章是基础篇,讲解了......一起来看看 《零基础学Java Web开发》 这本书的介绍吧!