go bufio :检验读取文件尾部变化内容,测试数据有没有丢失:文件大小5.3g

该博客介绍了一个使用Go语言实现的实时文件监控系统,通过10ms的轮询读取文件变化并写入新文件。同时,它包含了一个数据完整性的检查机制,确保在数据传输过程中没有丢失。主要涉及文件操作、缓存写入、goroutine以及通道的使用。
摘要由CSDN通过智能技术生成

    我在这里设置了10ms的轮询读取文件变化,并取值写到另外一个文本,最后比较两个文本的数据和readTest()的结果
    有没有更好的方案,欢迎赐教
    有没有更复杂对应的方案呢?欢迎赐教

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"
	"time"
)

func main () {
	ch := make(chan []byte, 1024)
	go readFromT(ch)
	go writeToT()
	go writeToT1(ch)
	time.Sleep(3*time.Minute)
	readTest()
}

// 用for高速写入到test.txt文件中
func writeToT () {
	filePath := "./test.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0777)
	if err != nil {
		fmt.Println("文件打开失败", err)
	}
	//及时关闭file句柄
	defer file.Close()
	//写入文件时,使用带缓存的 *Writer
	_, _ = file.Seek(0,2)
	write := bufio.NewWriter(file)
	start := time.Now().Minute()
	fmt.Println("开始写入T")
	i := 0
	for {
		stop := time.Now().Minute()
		if stop - start >= 2 {
			break
		}
		write.WriteString(fmt.Sprint(i) + "\n")
		write.Flush()
		i++
	}
	fmt.Println("结束写入T")
}

// 阻塞获取channel通道的值,写入到test1.txt文件中
func writeToT1 (ch chan []byte) {

	filePath := "./test1.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0777)
	if err != nil {
		fmt.Println("文件打开失败", err)
	}
	//及时关闭file句柄
	defer file.Close()
	_,_ = file.Seek(0, 2)
	//写入文件时,使用带缓存的 *Writer
	write := bufio.NewWriter(file)
	for i := range ch{
		write.WriteString(string(i) + "\n")
		write.Flush()
	}
}

// 先执行writeToT(),睡眠一分钟后,每隔10ms读取test.txt文件的变化内容(尾部),并放入到channel中
func readFromT (rc chan []byte) {
	file, err := os.Open("./test.txt")
	if err != nil {
		return
	}
	defer file.Close()
	//从末位开始逐行读取
	_, _ = file.Seek(0, 2)
	reader := bufio.NewReader(file)
	time.Sleep(1 * time.Minute)

	fmt.Println("读取T开始")
	for {
		line, err := reader.ReadBytes('\n')
		if err == io.EOF {
			time.Sleep(10 * time.Millisecond)
			continue
		} else if err != nil {
			panic(fmt.Sprintf("ReadBytes error:%s", err.Error()))
		}
		rc <- line[:len(line)-1]
	}
}

// 在test1.txt中,用后一行的值减去前一行的值,看看有没有数据丢失
func readTest () {
	file, err := os.Open("./test1.txt")
	if err != nil {
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	a := readOneValue(reader)
	fmt.Println("测试开始")
	for {
		b := readOneValue(reader)
		if b == -1 {
			break
		}
		if b == -2 {
			continue
		}
		if b - a != 1 {
			fmt.Printf("%+v ------> %+v\n", a, b)
		}
		a = b
	}
	fmt.Println("测试结束")
}
func readOneValue(reader *bufio.Reader) int {
	line, err := reader.ReadBytes('\n')
	if err == io.EOF {
		return -1
	} else if err != nil {
		panic(fmt.Sprintf("ReadBytes error:%s", err.Error()))
	}
	str := strings.TrimRight(string(line), "\n")
	if str == "" {
		return -2
	}
	v, _ := strconv.Atoi(str)
	return v
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值