Golang 文件读写

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

Golang 文件读写

读文件

使用ioutil直接读取

package read

import (
    "fmt"
    "io/ioutil"
    "strings"
)

// 使用ioutil直接读取
// 读取文件内容,并返回[]byte数据和错误信息。err == nil时,读取成功
func main() {
    file := "/usr/local/nginx/logs/access.log"
    if contents, err := ioutil.ReadFile(file); err == nil {
        //[]byte类型,转换成string类型后会多一行空格,使用strings.Replace替换换行符
        result := strings.Replace(string(contents), "\n", "", 1)
        fmt.Println(result)
    }
}

使用文件对象的Read方法读取

package read

import (
    "fmt"
    "os"
    "strconv"
    "strings"
)
// 使用文件对象的Read方法读取
// Read方法从文件中读取最多len(b)字节数据并写入
func main() {
    file := "/usr/local/nginx/logs/access.log"
    if fileObj,err := os.Open(file);err == nil {
        defer fileObj.Close()
        //在定义空的byte列表时尽量大一些,否则这种方式读取内容可能造成文件读取不完整
        buf := make([]byte, 1024)
        if n,err := fileObj.Read(buf);err == nil {
            fmt.Println("字节数:"+strconv.Itoa(n))
            result := strings.Replace(string(buf),"\n","",1)
            fmt.Println(result)
        }
    }
}

ioutil.ReadAll()读取文件示例

package read

import (
    "fmt"
    "os"
    "strconv"
    "strings"
)
// ioutil.ReadAll()读取文件示例
// Read方法从文件中读取最多len(b)字节数据并写入
func main() {
    file := "/usr/local/nginx/logs/access.log"
    if fileObj,err := os.Open(file);err == nil {
        defer fileObj.Close()
        //在定义空的byte列表时尽量大一些,否则这种方式读取内容可能造成文件读取不完整
        buf := make([]byte, 1024)
        if n,err := fileObj.Read(buf);err == nil {
            fmt.Println("字节数:"+strconv.Itoa(n))
            result := strings.Replace(string(buf),"\n","",1)
            fmt.Println(result)
        }
    }
}

使用os.Open和bufio.Reader读取文件内容

package read

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

// 使用os.Open和bufio.Reader读取文件内容
func main() {

    file := "/usr/local/nginx/logs/access.log"
    if fileObj, err := os.Open(file); err == nil {
        defer fileObj.Close()

        // 一个文件对象本身是实现了io.Reader的
        // 使用bufio.NewReader去初始化一个Reader对象,存在buffer中的,读取一次就会被清空
        reader := bufio.NewReader(fileObj)

        // 使用ReadString(delim byte)来读取delim以及之前的数据并返回相关的字符串.
        if result, err := reader.ReadString(byte('\n')); err == nil {
            fmt.Println("使用ReadSlince相关方法读取内容:", result)
        }

        // 注意:上述ReadString已经将buffer中的数据读取出来了,下面将不会输出内容
        // 需要注意的是,因为是将文件内容读取到[]byte中,因此需要对大小进行一定的把控
        buf := make([]byte, 1024)

        // 读取Reader对象中的内容到[]byte类型的buf中
        if n, err := reader.Read(buf); err == nil {
            fmt.Println(strconv.Itoa(n))
            fmt.Println(string(buf))
        }

    }
}

写文件

使用ioutil.WriteFile方式写入文件

package main
import (
    "fmt"
    "io/ioutil"
)

// 使用ioutil.WriteFile方式写入文件
// 将[]byte内容写入文件,如果content字符串中没有换行符的话,默认就不会有换行符
func main() {
    name := "./test.txt"
    content := "Hello, World!"
    data :=  []byte(content)
    if ioutil.WriteFile(name,data,0644) == nil {
        fmt.Println("写入文件成功:",content)
    }
}

使用WriteString()函数,将字符串写入一个Writer对象中

package main

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

// WriteString()函数,用来将字符串写入一个Writer对象中
func main() {

    name := "./test.txt"
    content := "Hello, World!"

    /*
        O_RDONLY int = syscall.O_RDONLY // 只读打开文件和os.Open()同义
        O_WRONLY int = syscall.O_WRONLY // 只写打开文件
        O_RDWR   int = syscall.O_RDWR   // 读写方式打开文件
        O_APPEND int = syscall.O_APPEND // 当写的时候使用追加模式到文件末尾
        O_CREATE int = syscall.O_CREAT  // 如果文件不存在,此案创建
        O_EXCL   int = syscall.O_EXCL   // 和O_CREATE一起使用, 只有当文件不存在时才创建
        O_SYNC   int = syscall.O_SYNC   // 以同步I/O方式打开文件,直接写入硬盘.
        O_TRUNC  int = syscall.O_TRUNC  // 如果可以的话,当打开文件时先清空文件
    */
    fileObj,err := os.OpenFile(name,os.O_RDWR|os.O_CREATE|os.O_APPEND,0644)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(2)
    }
    if  _,err := io.WriteString(fileObj,content);err == nil {
        fmt.Println("写入文件成功:",content)
    }
}

使用bufio包中Writer对象的相关方法进行数据的写入

package main

import (
    "bufio"
    "fmt"
    "os"
)

// 使用bufio包中Writer对象的相关方法进行数据的写入
func main() {

    name := "./test.txt"
    content := "Hello, World!\n"

    if fileObj,err := os.OpenFile(name,os.O_RDWR|os.O_CREATE|os.O_APPEND,0644);err == nil {
        defer fileObj.Close()

        // 使用WriteString方法,写入字符串并返回写入字节数和错误信息
        writeObj := bufio.NewWriterSize(fileObj,4096)
        if _,err := writeObj.WriteString(content);err == nil {
            fmt.Println(content)
        }

        // 使用Write方法,需要使用Writer对象的Flush方法将buffer中的数据刷到磁盘
        buf := []byte(content)
        if _,err := writeObj.Write(buf);err == nil {
            if  err := writeObj.Flush(); err != nil {panic(err)}
            fmt.Println(content)
        }
    }
}

文件监控

package main

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

// 文件监控
type DocMonitoring struct {
    LogPath   string      // 日志文件路径
    ReadChan  chan string // 读取chan
    WriteChan chan string // 写入chan
}

// 文件读取逻辑
func (dm *DocMonitoring) Read() {
    fmt.Println("Read start-up success")

    fileObj, err := os.Open(dm.LogPath);
    if err != nil {
        fmt.Println(err)
        os.Exit(2)
    }

    defer fileObj.Close()

    buf := bufio.NewReader(fileObj)
    // 定位到末尾
    fileObj.Seek(0, 2)
    for {
        if result, err := buf.ReadString('\n'); err == nil {
            if err == io.EOF {
                time.Sleep(100 * time.Millisecond)
                continue;
            } else {
                dm.ReadChan <- result
            }
        }
    }

}

// 内容处理逻辑
func (dm *DocMonitoring) Handle() {
    fmt.Println("Handle start-up success")
    for   {
        content := <-dm.ReadChan
        // 内容处理逻辑
        dm.WriteChan <- strings.ToLower(content)
    }
}

// 文件存储逻辑 (文件/db/nosql)
func (dm *DocMonitoring) Write() {

    fmt.Println("Write start-up success")

    // 将处理后的结果写入文件
    name := "./Write.txt"
    fileObj,err := os.OpenFile(name,os.O_RDWR|os.O_CREATE|os.O_APPEND,0644)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(2)
    }

    for   {
        content := <-dm.WriteChan
        if  _,err := io.WriteString(fileObj,content);err == nil {
            fmt.Println("写入成功:",content)
        }
    }
}

// 文件实时监控
// go run readlog.go /usr/local/nginx/logs/access.log
func main() {

    args:=os.Args

    //file := "/usr/local/nginx/logs/access.log"
    file := args[1]

    dm := &DocMonitoring{
        LogPath:  file,
        ReadChan: make(chan string, 1024),
        WriteChan: make(chan string, 1024),
    }
    go dm.Read()
    go dm.Handle()
    go dm.Write()
    for {
        time.Sleep(time.Second)
    }

}

参考


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

本文来自:简书

感谢作者:战神悟空

查看原文:Golang 文件读写

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

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