Go 中的 bufio 包
import (
"fmt"
"bufio"
)
如何从文本文件中读取数据
文件名
-
文件打开模式:有效的文件打开模式如下表所示。
标志 含义 O_RDONLY 以只读模式打开文件 O_WRONLY 以只写模式打开文件 O_RDWR 以读写模式打开文件 O_APPEND 写入时将数据追加到文件 O_CREATE 创建新文件(如果不存在) O_EXCL 与O_CREATE一起使用,以指示仅当文件不存在时才应创建该文件 O_SYNC 打开同步 I/O 的文件 O_TRUNC 如果可能,在打开时截断文件 文件权限:与 Linux 中用于指定文件访问规则的文件权限位相同,例如,0777 向所有用户类型授予读取、写入和执行权限。
下面的代码展示了如何使用 os.Open() 和 Scan() 从 Go 中的文本文件中读取数据, 在本例中,Scan() 在 Go for 循环中运行。
package main
import (
"bufio"
"fmt"
"log"
"os"
)
/**
CONTENT OF THE "linuxmi.txt" file.
lorem ipsum dolor sit amet
LOREM IPSUM DOLOR SIT AMET
Lorem ipsum dolor sit amet
Lorem Ipsum Dolor Sit Amet
lOREM iPSUM dOLOR sIT aMET
LoReM IpSuM DoLoR SiT AmEt
*/
func main() {
file, err := os.Open("linuxmi.txt")
// another method using os.OpenFile()
// file, err = os.OpenFile("linuxmi.txt", os.O_RDONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
fmt.Println("File opened successfully. Now reading file contents line by line:")
// create scanner from the file to read text from
scanner := bufio.NewScanner(file)
// scan or read the bytes of text line by line
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
运行上面的代码,它会产生如下所示的输出:
从文件中读取文本的程序输出
如果你只传入文件名而不是 Open() 或 OpenFile() 函数的路径以进行读取操作,Go 会假定文件在当前目录中,如果找不到则返回错误。如果您需要处理当前目录之外的文件,您应该传入文件的路径。
如何将数据写入文本文件
bufio 包提供了一个缓冲的 Writer 接口,该接口存储数据字节并在 Flush() 函数的帮助下将它们写入文件。
下一个示例代码是读取文件的延续。在此示例中,使用 O_WRONLY 和 O_APPEND 标志将数据写入现有的 linuxmi.txt。
将以下代码行添加到上面的程序中,在 main() 函数的右花括号之前:
// 将输出数据写入文件
file, err = os.OpenFile("linuxmi.txt", os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
fmt.Println("文件打开成功,正在准备将数据写入文件...")
// 创建缓冲的 Writer 对象以将数据写入文件
textWriter := bufio.NewWriter(file)
// 在保存文件之前将字符串写入缓冲区。
_, err = textWriter.WriteString("-这是添加到文件中的新文本。")
if err != nil {
log.Fatal(err)
}
textWriter.Flush()
fmt.Println("数据写入文件成功...")
完整程序的输出应如下所示:
程序的输出以读取和写入文本文件
当您打开 linuxmi.txt 文件时,您还将看到文件末尾附加的新行,如下图所示:
Go 中的文件处理非常简单
Go 允许您处理各种文件,而不仅仅是文本文件。有许多额外的内置库和函数用于处理来自文件的不同类型的数据,包括 JSON 和 CSV。
要查看它们在不同情况下的行为方式有何不同,您可以尝试可用于 OpenFile() 的各种标志和文件权限。