go语言开发基础34 - 之go语言里使用bufio包操作文件

bufio模块通过对io模块的封装,提供了数据缓冲功能,能够一定程度减少大块数据读写带来的开销。

实际上在bufio各个组件内部都维护了一个缓冲区,数据读写操作都直接通过缓存区进行。当发起一次读写操作时,会首先尝试从缓冲区获取数据;只有当缓冲区没有数据时,才会从数据源获取数据更新缓冲。

一、文件的读写操作

1.1、使用bufio包创建文件并写入内容

说明:

对文件写操作:os.OpenFile("filepath",os.O_WRONLY|os.O_CREATE,0666)

        第一个参数:要操作的文件路径
        第二个参数(可以写多个,用|分割):
                   os.O_WRONLY 以只写的方式打开文件
                   os.O_CREATE 创建文件(如果这个文件不存在就创建文件)
                   os.O_RDONLY 以只读的方式打开文件
                   os.O_RDWR:以读写的方式打开文件
                   os.O_TRUNC:清空文件
                   os.O_APPEND:以追加的方式打开文件
        第三个参数:权限:r:004、w:002、x:001
package main

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

func main() {
    // 打开文件句柄(两个返回值,一个是错误,一个是打开文件的句柄)
    // os.OpenFile("打开的文件",os.O_CREATE(如果没有这个文件就创建这个文件)|os.O_WRONLY(以写的方式打开),文件权限)
    file, err := os.OpenFile("f:/test_go_file.log", os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {     // 判断打开文件是否有错误
        fmt.Println("open file error:", err)
        return
    }
    defer file.Close()      // 使用的defer语句关闭文件
    fileWrite := bufio.NewWriter(file)
    inputStr := "Hello World ...\n"
    for i := 0; i < 10; i++ {       // 循环写入数据
        fileWrite.WriteString(inputStr)
    }
    fileWrite.Flush()
}

 

1.2、使用bufio包按行读取文件内容、

说明:

打开一个文件进行读操作:os.Open(filepath)
package main

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

func main() {
    file, err := os.Open("f:/test_go_file.log") // 打开文件
    if err != nil {                             // 判断错误
        fmt.Println("read file err:", err)
        return
    }
    defer file.Close()        // 使用defer关闭文件
    reader := bufio.NewReader(file) // 读取源(带缓冲的读)
    for {
        str, err := reader.ReadString('\n') // 读取字符串(这里时字节类型,要用但引号:'\n')
        if err == io.EOF {                  // 判断文件是不是结尾,读取到文件结尾时会获取到一个io.EOF错误
            break
        }
        if err != nil {   // 判断错误,打印错误
            fmt.Printf("read file failed, err:%v", err)
            break
        }
        fmt.Printf("read string SuccessFull: %s\n", str)     // 打印读取的文件内容
    }
}

 

练习:读取一个文件,判断读取的内容里字母、空格与数字的数量

package main

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

// 定义结构体
type CharCount struct {
    ChCount    int
    NumCount   int
    SpaceCount int
    OtherCount int
}

func main() {
    file, err := os.Open("f:/test_go_file.log") // 打开文件
    if err != nil {                             // 判断错误
        fmt.Println("read file err:", err)
        return
    }
    defer file.Close()

    var count CharCount

    reader := bufio.NewReader(file) // 读取源(带缓冲的读)
    for {
        str, err := reader.ReadString('\n') // 读取字符串
        if err == io.EOF {                  // 判断文件是不是结尾,读取到文件结尾时会获取到一个io.EOF错误
            break
        }
        if err != nil { // 判断错误,打印错误
            fmt.Printf("read file failed, err:%v", err)
            break
        }

        runeArr := []rune(str)      // 将字符串转为数组类型
        for _, v := range runeArr { // 循环读取数组
            switch {
            case v >= 'a' && v <= 'z': // 判断是不是小写字母
                fallthrough
            case v >= 'A' && v <= 'Z': // 判断是不是大写字母
                count.ChCount++
            case v == ' ' || v == '\t': // 判断是不是空格
                count.SpaceCount++
            case v >= '0' && v <= '9': // 判断是不是数字
                count.NumCount++
            default:
                count.OtherCount++
            }
        }

    }

    fmt.Printf("char count:%d\n", count.ChCount)
    fmt.Printf("num count:%d\n", count.NumCount)
    fmt.Printf("space count:%d\n", count.SpaceCount)
    fmt.Printf("other count:%d\n", count.OtherCount)
}

 

二、拷贝文件

package main

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

// 拷贝文件函数(从srcName拷贝到dstName)
func copyFile(dstName, srcName string) (written int64, err error) {
    // 以只读的方式打开srcName
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    // 通过defer定义关闭文件的命令
    defer src.Close()
    // 以写的方式打开dstName,os.O_CREATE:如果没有这个文件就创建这个文件,文件权限644
    dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
    if err != nil {
        return
    }
    defer dst.Close()        // 通过defer定义关闭文件的命令
    return io.Copy(dst, src) // 通过io.Copy实现拷贝
}

func main() {
    copyFile("dstfile.txt","srcfile.txt")  
}

 

posted @ 2020-07-20 18:48  欧-阳  阅读(436)  评论(0)    收藏  举报