Go语言使用bufio.Writer写入文件后内容为空是什么原因?
问题根因
文件为空由两处错误共同导致:
- 调用
os.OpenFile时传入的打开标志缺少写权限,你当前仅使用了os.O_CREATE|os.O_APPEND,没有追加os.O_WRONLY(只写)或者os.O_RDWR(读写)标志,操作系统会拒绝向该文件句柄写入数据 bufio.Writer是带内存缓冲的写入器,循环内所有写入操作只是把数据存到了内存缓冲区,你没有调用Flush()方法把缓冲区数据真正刷写到磁盘,程序退出后缓冲内的数据会直接丢失
补充说明:你能看到文件被正常创建,是因为O_CREATE标志只要求进程有对应目录的写权限即可创建文件,和打开的文件句柄本身是否拥有写权限无关。
修复方案
修改打开文件的标志,并且在写入逻辑结束后主动刷写缓存,修改后的代码如下:
// 新增os.O_WRONLY标志,开启写权限 file, err := os.OpenFile("filename.db", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666) if err != nil { log.Fatal(err) } defer file.Close() res := 0 writer := bufio.NewWriter(file) // 新增defer Flush,确保程序退出前把缓冲数据刷到磁盘 defer writer.Flush() for _, data := range manager { bin, err := json.Marshal(data) if err != nil { log.Println(err) return } res++ if debug { log.Println(res) } fmt.Printf("%s\n", bin) _, err = writer.Write(bin) if err != nil { log.Println(err) } _, _ = writer.WriteRune('\n') }
内容的提问来源于stack exchange,提问作者Wynell
相关产品推荐
相关产品推荐

