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

浙公网安备 33010602011771号