golang 文件读写

读文件

ReadFile直接读取

package main

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

// 使用ReadFile直接读取
// 读取文件内容,并返回[]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)
    }
}

ReadAll 读取文件

package main

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

// ioutil.ReadAll()读取文件示例
// ReadAll从源中读取数据直到EOF
func main() {
    file := "/usr/local/nginx/logs/access.log"
    if fileObj,err := os.Open(file);err == nil {
        //if fileObj,err := os.OpenFile(name,os.O_RDONLY,0644); err == nil {
        defer fileObj.Close()
        if contents,err := ioutil.ReadAll(fileObj); err == nil {
            result := strings.Replace(string(contents),"\n","",1)
            fmt.Println("Use os.Open family functions and ioutil.ReadAll to read a file contents:",result)
        }

    }
}


Read方法读取

package main

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


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

package main

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

    }
}


写文件

使用 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 方式写入文件

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 文件读写)