这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
文件访问权限常量定义
// 只读方式打开文件
O_RDONLY
// 只写方式打开文件
O_WRONLY
// 读写方式打开文件
O_RDWR
// 向文件中写入数据时, 添加到文件末尾
O_APPEND
// 如果文件不存在, 则创建该文件
O_CREATE
// 和O_CREATE一同使用, 如果文件存在, 则返回错误
O_EXCL
// 以同步的方式打开文件
O_SYNC
// 如果文件存在, 则清空文件中的内容
O_TRUNC
io读数据
func ioRead() {
// 打开文件
fo, err := os.OpenFile("./xx.txt", os.O_RDONLY, 0644)
// 关闭文件
defer fo.Close()
if err != nil {
fmt.Println("open file failed: ", err)
}
fmt.Println(fo.Name())
// 创建切片, 指定长度, 将文件读到切片中
s := make([]byte, 8)
// 通过for循环将文件中的全部内容读取出来
for {
n, err := fo.Read(s);
if err != nil {
// 当文件读取完毕时, 返回EOF
if err == io.EOF {
fmt.Println("\n文件读取完毕")
} else {
// 其它错误
fmt.Println("\n文件读取失败")
}
return
}
// 打印每次读取到的内容
fmt.Print(string(s[:n]))
}
// 读取一次
//_, err = fo.Read(s)
if err != nil {
fmt.Println("read file failed: ", err)
}
fmt.Println(string(s))
}
io写数据
func ioWrite() {
// 打开文件
fo, err := os.OpenFile("./xx.txt", os.O_WRONLY | os.O_APPEND, 0644)
// 关闭文件
defer fo.Close()
if err != nil {
fmt.Println("open file failed: ", err)
}
fmt.Println(fo.Name())
// 通过切片, 将数据写入文件
str := "Hi gopher"
_, err = fo.Write([]byte(str))
// 通过字符串, 将数据写入文件
//_, err = fo.WriteString("hi gopher")
if err != nil {
fmt.Println("write file failed: ", err)
} else {
fmt.Println("数据写入成功")
}
}
ioutil读数据
func ioutilRead() {
// 打开文件
fo, err := os.OpenFile("./xx.txt", os.O_RDONLY, 0644)
// 关闭文件
defer fo.Close()
if err != nil {
fmt.Println("open file failed: ", err)
return
}
// 读取文件中的所有内容
s, err := ioutil.ReadAll(fo)
// 使用ioutil包下的ReadFile方法直接读取文件
//s, err := ioutil.ReadFile("./xx.txt")
if err != nil {
fmt.Println("read file failed: ", err)
return
}
fmt.Println(string(s))
}
ioutil写数据
func ioutilWrite() {
// 通过切片, 向文件中写入数据
err := ioutil.WriteFile("./xx.txt", []byte("hi go"), 0644)
if err != nil {
fmt.Println("write file failed: ", err)
}
fmt.Println("数据写入成功")
}
bufio读数据
func bufioRead() {
// 打开文件
fo, err := os.OpenFile("./xx.txt", os.O_RDONLY, 0644)
// 关闭文件
defer fo.Close()
if err != nil {
fmt.Println("open file failed: ", err)
}
reader := bufio.NewReader(fo)
//line, _, _ := reader.ReadLine()
//fmt.Println(string(line))
// 读取全部内容
for {
str, err := reader.ReadString('\n')
fmt.Print(str)
if err != nil {
if err == io.EOF {
fmt.Println("\n文件读取完成")
} else {
fmt.Println("\nread file failed: ", err)
}
return
}
}
}
bufio写数据
func bufioWrite() {
// 打开文件
fo, err := os.OpenFile("./xx.txt", os.O_WRONLY, 0644)
// 关闭文件
defer fo.Close()
if err != nil {
fmt.Println("open file failed: ", err)
}
// 创建bufio的writer
writer := bufio.NewWriter(fo)
// 向文件中写入字符串
n, err := writer.WriteString("hi")
if err != nil {
fmt.Println("write file failed: ", err)
return
}
fmt.Println(n)
writer.Flush()
}
总结
Go中的文件操作方式有很多种, 但是它们的底层都是对file的封装, 以提供给我们一些常用的功能. 在使用的时候, 我们只需要选择最适合自己的文件操作方式就可以了!!!