读文件三种方式
读文件还是很方便的,go语言中直接提供IoUtile包可以直接读取,也可以使用原生代码读取
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
)
/**
读取文件
*/
func main() {
fileName := "/Users/pilgrim/Desktop/go/TestDemo/src/file/a.txt";
str := readFile(fileName)
fmt.Printf("读取到的文件内容是: \n %s " , str)
fmt.Println("\n ioUtliRead读取到的文件内容是 " )
ioUtliRead(fileName)
fmt.Println("\n ioUtliReadAll 读取到的文件内容是 " )
ioUtliReadAll(fileName)
}
//缓冲读取
func readFile(fileName string) string{
var str string
open, err := os.Open(fileName)
if err!=nil {
fmt.Printf("打开文件失败 ",err.Error())
return ""
}
//关闭文件 defer可以延迟关闭
defer open.Close();
for {
tem := make([]byte,128,128)
//读取文件内容
_, err := open.Read(tem)
str += string(tem)
//文件读取结束
if err == io.EOF {
fmt.Println("读取结束")
return str
}
if err!=nil {
fmt.Println("读取失败 ",err.Error())
return ""
}
}
fmt.Printf("str %s",str)
return str
}
//使用ioutile 读取
func ioUtliRead(fileName string) {
file, err := ioutil.ReadFile(fileName)
if err != nil {
fmt.Println(err.Error())
return
} else {
fmt.Println(string(file))
}
}
//使用 ReadAll 读取
func ioUtliReadAll(fileName string) {
open, err := os.Open(fileName)
if err != nil {
fmt.Printf("打开文件失败 %s", err.Error())
return
}
defer open.Close()
file, err := ioutil.ReadAll(open)
if err != nil {
fmt.Println(err.Error())
return
} else {
fmt.Println(string(file))
}
}
//按行读取
func readByLine(fileName string) {
open, err := os.Open(fileName)
if err != nil {
fmt.Printf("打开文件失败 %s", err.Error())
return
}
defer open.Close()
reader:=bufio.NewReader(open) //带缓冲区的读写
for {
str,err:=reader.ReadString('\n') //循环读取一行
if err==io.EOF {
fmt.Printf("读取的每行内容 : %s ",str)
fmt.Println("读取结束")
return
}
if err!=nil {
fmt.Println("读取错误 : %s",err.Error())
return
}
fmt.Printf("读取的每行内容 : %s",str)
}
}
写文件操作go语言也提供了一个util可以直接写
也可以使用原生的api操作
需要注意的是写文件需要提供文件操作权限,需要指定对文件的只读只写等
下图为源码 指定file flag
注释
const (
O_RDONLY int = syscall.O_RDONLY //只读模式打开文件
O_WRONLY int = syscall.O_WRONLY //只写模式打开文件
O_RDWR int = syscall.O_RDWR //读写模式打开文件
O_APPEND int = syscall.O_APPEND //写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT //如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL //和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC //打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC //如果可能,打开时清空文件
)
package main
import (
"fmt"
"os"
)
func main() {
fileName := "./src/file/wirter/b.txt"
file, err := os.OpenFile(fileName,os.O_APPEND|os.O_CREATE|os.O_WRONLY,0755)
if err!=nil {
return
}
file.Write([]byte("我是内容1 \n"))
file.WriteString("我是内容2")
file.Fd()
file.Close()
//读取
readFile, err := os.ReadFile(fileName)
fmt.Println(string(readFile))
//源码默认会清空
//f, err := OpenFile(name, O_WRONLY|O_CREATE|O_TRUNC, perm)
err = os.WriteFile(fileName, []byte("写入内容123456789"), 0755)
if err==nil {
fmt.Println("写入成功")
}else{
fmt.Printf("写入失败 %s ",err)
}
//读取
r, err := os.ReadFile(fileName)
fmt.Println(string(r))
}
//缓冲区写入
func write(fileName string) {
file,err:=os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY,0755)
if err!=nil {
fmt.Println("error",err)
os.Exit(1)
}
defer file.Close()
fileWrite:=bufio.NewWriter(file)
fileString:="小王啊\n"
for i := 0; i<10; i++ {
fileWrite.WriteString(fileString)
}
fileWrite.Flush() //将缓冲中的数据写入下层的io.Writer接口(Flush方法)
}