ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 打开与关闭文件 `OS.Open()` 函数可以打印一个文件。返回一个 `*os.File` 和 `err` ```go func main() { // 打开文件 file, err := os.Open("test.txt") if err != nil { fmt.Println(err) } // 关闭文件 file.Close() } ``` # 读文件 ## 按照字节读取内容 ```go func readByte(file *os.File) { data := make([]byte, 15) file.Read(data) fmt.Println(string(data)) } func main() { file, err := os.Open("test.txt") if err != nil { fmt.Println(err) } else { readByte(file) file.Close() } } ``` ## 按照行读取内容 **方式一** 弊端:读到最后一行是没有换行符号,str和err都是有值的。 ```go func readLines(file *os.File) { reader := bufio.NewReader(file) str, err := reader.ReadString('\n') if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Print(str) } } func main() { file, err := os.Open("test.txt") if err != nil { fmt.Println(err) } else { readLines(file) file.Close() } } ``` **方式二** 【推荐】 ```go func readLines(file *os.File) { reader := bufio.NewReader(file) b, _, err := reader.ReadLine() if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Println(string(b)) } } func main() { file, err := os.Open("test.txt") if err != nil { fmt.Println(err) } else { readLines(file) file.Close() } } ``` ## 读取整个文件 **方式一** 文件大的话,不建议使用。读取文件会先将内容加载到内存中。 ```go func readFile(filename string) { b, err := ioutil.ReadFile(filename) if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Println(string(b)) } } func main() { readFile("test.txt") file.Close() } ``` **方式二** 【推荐】 ```go func readLines(file *os.File) { reader := bufio.NewReader(file) for true { b, _, err := reader.ReadLine() if err != nil { // 判断是否已经读取完整个文件内容 if err == io.EOF { break } fmt.Printf("err: %v\n", err) } else { fmt.Println(string(b)) } } } func main() { file, err := os.Open("test.txt") if err != nil { fmt.Println(err) } else { readLines(file) file.Close() } } ``` # 写文件 OpenFile是通用的公开调用;大多数用户会使用“打开”或“创建”。它打开带有指定标志(O_RDONLY等)的命名文件。如果文件不存在,并且传递了O_CREATE标志,则使用模式perm(在umask之前)创建该文件。如果成功,返回的File上的方法可以用于I/O。如果有一个错误,它的类型将是*PathError。 | 文件模式 | 含义 | | :-: | :-: | | os.O_RDONLY | 以只读方式打开文件 | | os.O_WRONLY | 以只写方法打开文件 | | os.O_RDWR | 以读写方式打开文件 | | os.O_APPEND | 以追加方式打开文件 | | os.O_CREATE | 如果不存在,创建一个新文件 | | os.O_EXCL | 与O_CREATE一起使用,文件必须不存在 | | os.O_SYNC | 同步方式打开,即不使用缓存,直接写入硬盘 | | os.O_TRUNC | 打开时截断常规可写文件 | 详细请看官网文档:https://pkg.go.dev/os#pkg-constants ## 直接写入文件 ```go func writeByteOrString(file *os.File) { s := "jiaxzeng\n" // 方式一 // file.Write([]byte(s)) // 方式二 file.WriteString(s) } func main() { file, err := os.OpenFile("notes.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644) if err != nil { fmt.Printf("err: %v\n", err) } else { writeByteOrString(file) } } ``` ## 先写缓存再落盘 ```go func writeByBufio(file *os.File) { writer := bufio.NewWriter(file) writer.WriteString("jiaxzeng\n") writer.Flush() } func main() { file, err := os.OpenFile("notes.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644) if err != nil { fmt.Printf("err: %v\n", err) } else { writeByBufio(file) } } ``` ## 创建或清空再写入文件 创建或清空再写入文件. 当文件存在, 清空文件再写入. 不修改文件的权限; 当文件不存在, 创建指定权限文件再写入 ```go func main() { s := "jiaxzeng\n" ioutil.WriteFile("notes.txt", []byte(s), 0644) } ```