美文网首页
golang 文件读写

golang 文件读写

作者: 零一间 | 来源:发表于2019-08-01 11:40 被阅读0次

    读文件

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

          本文链接:https://www.haomeiwen.com/subject/yqlqdctx.html