go文件操作
go文件操作
2021年3月17日
10:58
os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。
file.Read() 读取文件
Read方法定义如下:
func (f *File) Read(b []byte) (n int, err error)
它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0和io.EOF。 举个例子:
在指定文件读取128个字节内容
func main() { //os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件 file, err := os.Open("./bei.go") if err != nil { log.Fatal(err) } defer file.Close() tmp := make([]byte, 128) n, err := file.Read(tmp) //先读128个字节,返回0,io.Eof时代表读完文件 if err == io.EOF { fmt.Println("成功读完文件") } if err != nil { fmt.Println("读取文件失败,err:", err) return } fmt.Printf("读取了%v字节数据\n", n) fmt.Println(string(tmp[:n])) }
循环读取至文件末尾
func main() { file, err := os.Open("./bei.go") if err != nil { log.Fatal(err) } defer file.Close() tmp := make([]byte, 128) var content []byte for { n, err := file.Read(tmp) if err == io.EOF { fmt.Println("读取结束") break } if err != nil { fmt.Println("读取失败", err) return } //... 是因为tmp切片中的元素一个个被打散加入content切片 content = append(content, tmp[:n]...) } fmt.Println(string(content)) }
bufio是在file的基础上封装了一层API,支持更多的功能。
核心代码:
reader := bufio.NewReader(file) line, err := reader.ReadString('\n')
打印所有行时,读到最后一行会返回io.EOF,最后一行没有被打印,记得err判定时加印一行
if err == io.EOF { fmt.Printf(line) return }
io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。
核心代码:
content, err := ioutil.ReadFile("./main.go") fmt.Println(string(content))
写入文件
os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能
文件写入操作
os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
其中:
name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:
模式 |
含义 |
os.O_WRONLY |
只写 |
os.O_CREATE |
创建文件 |
os.O_RDONLY |
只读 |
os.O_RDWR |
读写 |
os.O_TRUNC |
清空 |
os.O_APPEND |
追加 |
perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。
核心代码:
file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
str := "hello 沙河" file.Write([]byte(str)) //写入字节切片数据 file.WriteString("hello 小王子") //直接写入字符串数据
os.O_WRONLY | os.O_CREATE | O_EXCL 【如果已经存在,则失败】
os.O_WRONLY | os.O_CREATE 【如果已经存在,会覆盖写,不会清空原来的文件,而是从头直接覆盖写】
os.O_WRONLY | os.O_CREATE | os.O_APPEND 【如果已经存在,则在尾部添加写】
bufio.NewWriter
func new_writer() { file, err := os.OpenFile("./bei.go", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { log.Fatal(err) } defer file.Close() writer := bufio.NewWriter(file) writer.WriteString("sdasicxjabc") writer.Flush() }
注意先是写入缓存,再写入文件
ioutil.WriteFile
直接写入文件(会清空覆盖原内容)
func write_file() { str := "lxf2333" err := ioutil.WriteFile("./bei.go", []byte(str), 0666) if err != nil { fmt.Println("err=====", err) return } }