非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第11章 文件操作
- 11.2 文件基本操作
- 11.2.2 文件读取
第11章 文件操作
11.2 文件基本操作
11.2.2 文件读取
想要读取文件可以使用os库中的Read接口:
func (f *File) Read(b []byte) (n int, err error)
Read方法从文件中读取最多len(b)字节数据并写入byte数组b,它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。
[ 动手写 11.2.2]
package main
import (
"fmt"
"os"
)
func ReadFile(path string) {
// 读取文件内容
file, err := os.Open(path)
if err != nil {
fmt.Println(err)
}
// 创建byte 的slice用于 接收文件读取数据
buf := make([]byte, 1024)
fmt.Println("以下是文件内容: ")
// 循环读取
for {
// Read 函数会改变文件当前偏移量
len, _ := file.Read(buf)
// 读取字节数为0 时跳出循环
if len == 0 {
break
}
fmt.Println(string(buf))
}
file.Close()
}
func main() {
ReadFile("C:\\Windows\\Temp\\1.txt")
}
运行结果
当遇到特别大的文件,并且只需要读取文件最后部分的内容时,Read接口就不能满足我们的需要了,这时可以使用另外一个文件读取接口ReadAt,这个接口可以指定从文件的什么位置开始读取。
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入byte数组b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。
[ 动手写 11.2.3]
package main
import (
"fmt"
"os"
)
func ReadFile2(path string) {
// 读取文件内容
file, err := os.Open(path)
if err != nil {
fmt.Println(err)
}
// 创建byte 的slice用于接收文件读取数据
buf := make([]byte, 1024)
fmt.Println("以下是文件内容: ")
// 读取偏移9 字节的数据
_, _ = file.ReadAt(buf, 9)
fmt.Println(string(buf))
_ = file.Close()
}
func main() {
ReadFile2("C:\\Windows\\Temp\\1.txt")
}
运行结果
动手写11.2.3指定从文件开始位置,即ix=0处开始读取。
【提示】
Read和ReadAt的区别:前者从文件当前偏移量处开始读取,且会改变文件当前的偏移量;而后者从off指定的位置开始读取,且不会改变文件当前偏移量。