Go语言文件操作
打开和关闭文件
os.Open()函数能够打开一个文件,返回一个*File和一个err。
file.close()方法能够关闭文件。
//打开和关闭文件
func main() {
file,err := os.Open("test.txt")
if err != nil{
fmt.Println("打开文件失败",err)
return
}
//文件能打开的情况下,使用defer延迟关闭文件
defer file.Close()
}
读取文件
基本使用
file.Read()方法可以读取文件,它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0和io.EOF。
定义:
func (f *File) Read(b []byte) (n int, err error)
示例:
func main() {
//打开文件
f,err := os.Open("woceng.txt")
if err!= nil{
fmt.Println("文件打开失败",err)
return
}
//关闭文件
defer f.Close()
//读取文件
var geci = make([]byte,256)
g,err := f.Read(geci)
if err == io.EOF{
fmt.Println("文件读取完毕!")
return
}
if err!= nil{
fmt.Println("文件打开失败",err)
return
}
//只会读取之前切片定义的256字节数据,若文件内容大于256字节,则超出部分无法显示
fmt.Printf("读取了%d字节数据\n", g)
fmt.Println(string(geci[:g]))
}
循环读取
使用for循环读取。
var geci = make([]byte,256)
for {
g,err := f.Read(geci)
if err == io.EOF{
fmt.Println("文件读取完毕!")
return
}
if err!= nil{
fmt.Println("文件打开失败",err)
return
}
//会全部读取,但是每256字节会进行重新读取,可能会出现乱码
fmt.Printf("读取了%d字节数据\n", g)
fmt.Println(string(geci[:g]))
}
bufio读取文件
读取文件中会有个缓冲区,先把内容读到缓冲区,然后统一读取,不过可能会丢数据(内存)。
func main() {
file,err := os.Open("woceng.txt")
if err != nil{
fmt.Println("文件读取错误",err)
return
}
defer file.Close()
// 利用缓冲区从文件读数据
reader := bufio.NewReader(file)
for{
line,err := reader.ReadString('\n') //字符串读取,每到换行就停止
if err == io.EOF {
fmt.Println("文件读完了")
break
}
if err != nil {
fmt.Println("read file failed, err:", err)
return
}
fmt.Print(line)
}
}
ioutil读取整个文件
ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。
// ioutil读取文件
func readioutil(filename string) {
content,err := ioutil.ReadFile(filename)
if err != nil{
fmt.Println("文件读取错误",err)
return
}
fmt.Println(string(content))
}
文件写入
os.OpenFile()方法实现文件写入相关功能。
语法:
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
name:要打开的文件名
flag:打开文件的模式
perm:文件权限,一个八进制数
模式 | 含义 |
---|---|
os.O_WRONLY | 只写 |
os.O_CREATE | 创建文件 |
os.O_RDONLY | 只读 |
os.O_RDWR | 读写 |
os.O_TRUNC | 清空 |
os.O_APPEND | 追加 |
Write和WriteString
//打开文件支持文件写入
func main() {
file,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0644)
if err != nil{
fmt.Println("打开文件失败",err)
return
}
defer file.Close()
str := "ares"
file.Write([]byte("666\n")) //写入字节切片数据
file.WriteString(str) //直接写入字符串数据
}
bufio.NewWriter
将数据先写入缓存。
//打开文件支持文件写入
func main() {
file,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0644)
if err != nil{
fmt.Println("打开文件失败",err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for i := 0;i<10;i++{
writer.WriteString("heoolo\n") ////将数据先写入缓存
}
writer.Flush() //将缓存中的内容写入文件
}
ioutil.WriteFile
将内容直接写入文件中,避免了打开文件操作。直接覆盖文件内容
func main() {
str := "aresares"
err := ioutil.WriteFile("test.txt",[]byte(str),0644)
if err != nil{
fmt.Println("写文件失败",err)
return
}
}

更多精彩