文件内容读取方式
包的简单介绍
os包提供了一个独立于平台的接口来执行操作级操作。IOutil软件包提供了易于使用的实用程序函数来处理文件,而无需了解太多内部实现。bufio包实现了缓冲IO,这有助于我们提高输入和输出操作的性能和吞吐量。log?包实现一个简单的日志记录包。我们将在整个程序中使用它。我们将在程序中使用日志包的Fatal() 函数。
a.整篇读取
//打开文件
file, _ := os.Open("./maze.txt")//文件路径
content, err := io.ReadAll(file)//读取文件内容
if err != nil {
log.Fatal(err)//日志包
}
fmt.Println(string(content))输出内容
```
-
细讲:
os.Open()函数返回*File和error,所以file为文件指针io.ReadAll(文件指针)函数返回[]byte和error,content接收的是byteArray,所以在输出的时候需要强转为string
b.按行读取
-
Scanner扫描器提供了一个方便的接口来读取数据,比如一个由新行分隔的文本行组成的文件。它通过标记来读取数据;Split函数定义了标记。默认情况下,该函数将数据分成几行,并剥离了行端。 -
创建
Scannerscanner := bufio.NewScanner(file) //参数是*Reader,返回值是*Scanner
-
Scanner内置函数-
scanner.Scan()它会扫描源中的下一个标记,将其视为文本并返回是否找到了标记。如果找到了标记,标记内容可以在scanner.Text()中访问。有数据就返回true,没有数据后返回false -
scanner.Text()用于获取最近一次Scan()方法调用找到的标记的内容 -
scanner.Bytes()与Text()用法一致,只是它返回的是字节数组,可以通过强转输出字符串 -
scanner.Err()用于返回最近一次Scan()方法调用是否返回了一个错误。如果扫描过程中出现了错误,则Scan()方法会停止并返回该错误,可以使用Err()方法访问该错误。 -
scanner.Split()是用于设置读取器在扫描过程中如何确定输入的标记的边界的分割函数 -
scanner.Buffer()用于指定Scanner实例使用的缓冲区。这个方法可以用来控制Scanner的缓冲区大小和使用。scanner := bufio.NewScanner(file) bufferSize := 1024 * 1024 //1MB buf := make([]byte, bufferSize) scanner.Buffer(buf, bufferSize) -
使用 -
//打开文件 file, _ := os.Open("./maze.txt")//文件路径 content, err := io.ReadAll(file)//读取文件内容 if err != nil { log.Fatal(err)//日志包 } scanner:=bufio.NewScanner(file) for scanner.Scan(){//在扫描不到数据后返回false退出循环 fmt.Println(scanner.Text()) }
-
c.单个单词读取
-
使用: -
file, err := os.Open("./maze.txt") if err != nil { log.Fatal(err) } defer file.Close() //创建一个Scanner scanner := bufio.NewScanner(file) //参数是*Reader,返回值是*Scanner scanner.Split(bufio.ScanWords) for scanner.Scan() { fmt.Println(scanner.Text()) }- 单个单词读取主要使用了
scanner.Split(bufio.ScanWords) - 其他参数的效果
- 单个单词读取主要使用了
Split参数 | 效果 |
|---|---|
bufio.ScanWords | 用于将输入数据按照空格分割成单词的分割函数 |
bufio.ScanLines | 用于将输入数据按照行分割的分割函数 |
bufio.ScanBytes | 一个用于按照字节分割输入数据的分割函数 |
bufio.ScanRunes | 一个用于按照Unicode字符分割输入数据的分割函数 |
d.以数据块的形式读取
-
使用:
//创建一个Reader reader := bufio.NewReader(file) //参数是*Reader,返回值是*Scanner buf := make([]byte, 16) for { n, err := reader.Read(buf) if err != nil { if err != io.EOF { log.Fatal(err) } break } fmt.Println(string(buf[0:n])) }-
这里利用了
bufio.NewReader()利用reader读取数据 -
reader.Read(buf)它接受一个字节数组buf作为参数,并从reader中读取数据以填充字节数组。然后,它返回填充的字节数n以及err。 -
区别
bufio.NewReader方法返回一个Reader类型的对象,可以从任何实现了io.Reader接口的对象中读取数据,例如文件、网络连接等。bufio.NewReader方法包装了一个io.Reader接口,并添加了缓存,可以提高读取效率bufio.NewScanner则返回一个Scanner类型的对象,该对象可以按行、字节、单词或自定义分隔符从输入数据中读取数据。
-