go 学习笔记:文件操作

Posted on 2021-02-18 00:36  王石头py  阅读(61)  评论(0)    收藏  举报

文件操作

打开文件 os.Open()/os.OpenFile()

//打开文件只读文件,不会写入文件的情况用 os.open()
//如果涉及写入,用os.OpenFile()打开文件
	fileobj,err := os.Open("./xxx.txt")
	if err != nil{
		fmt.Println("打开文件失败... ",err)
		return
	}

读取文件

单次读取文件 file.read()

  • 测试读取的文件内容 (包括换行符共7字节)
abc
xyz
  • 单次读取数据量比较小的文件读取
package main

import (
	"fmt"
	"os"
)

func readFromFile(){
	//打开文件
	//打开文件只读,不会写入的情况用 os.Open(),涉及写入用os.OpenFile()
	fileObj,err := os.Open("./xxx.txt")
	if err != nil{
		fmt.Printf("打开文件失败... 错误信息:%v\n",err)
		return
	}

	//读取文件
	//创建 并 初始化 长度128字节的空切片,用来存放读取的数据
	var tmp = make([]byte,128)		//一次读128个字节
	n,err := fileObj.Read(tmp)		//返回n文件读出来多少个字节,err读取错误信息
	if err != nil{
		fmt.Printf("读取文件内容失败... 错误信息:%v\n",err)
		return
	}
	fmt.Printf("读取%d字节数据\n",n)
	fmt.Println(string(tmp))

	//关闭文件,防止忘记关闭文件,用defer延迟关闭
	defer fileObj.Close()
}


func main() {
  readFromFile()
}

循环读取文件

  • 文件内容
abc
xyz
var tmp = make([]byte,128)
var tmp = make([]byte,128)
var tmp = make([]byte,128)
var tmp = make([]byte,128)
var tmp = make([]byte,128)
a
b
c
d
e
f
g
  • 循环读取
package main

import (
	"fmt"
	"io"
	"os"
)

func readAll(){
	//打开文件
	//打开文件只读,不会写入的情况用 os.Open(),涉及写入用os.OpenFile()
	fileObj,err := os.Open("./xxx.txt")
	if err != nil{
		fmt.Printf("打开文件失败... 错误信息:%v\n",err)
		return
	}
	//关闭文件,防止忘记关闭文件,用defer延迟关闭
	defer fileObj.Close()

	//读取文件
	var countN = 0						//统计读取总共字节数
	for{
		//创建 并 初始化 长度128字节的空切片,用来存放读取的数据
		var tmp = make([]byte,128)		//一次读128个字节
		n,err := fileObj.Read(tmp)		//返回n文件读出来多少个字节,err读取错误信息
		if err == io.EOF{				//End Of File 代表 已经读到文件末尾,把当前读了多少个字节数据打印出来,然后退出
			fmt.Println(string(tmp[:n]))	//切片:从开始到字节数结尾
			fmt.Printf("--------总共读取%d字节--------\n",countN)
			return
		}
		if err != nil{
			fmt.Printf("读取文件内容失败... 错误信息:%v\n",err)
			return
		}
		fmt.Printf("读取%d字节数据\n",n)
		countN += n
		fmt.Println(string(tmp[:n]))	//切片:从开始到字节数结尾
	}
}

func main() {
	readAll()
}

bufio 读取文件

bufio是在file的基础上封装了一层API,支持更多的功能。

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func readByBufio(){
	//打开文件
	//打开文件只读,不会写入的情况用 os.Open(),涉及写入用os.OpenFile()
	fileObj,err := os.Open("./xxx.txt")
	if err != nil{
		fmt.Printf("打开文件失败... 错误信息:%v\n",err)
		return
	}
	//关闭文件,防止忘记关闭文件,用defer延迟关闭
	defer fileObj.Close()

	//读取文件
	reader := bufio.NewReader(fileObj)
	
	for  {
		line,err := reader.ReadString('\n')	//按照换行符\n读,返回的line就是string
		if err == io.EOF {
			if len(line) != 0 {
				fmt.Println(line)
			}
			return
		}
		if err != nil {
			fmt.Printf("读取文件失败,错误信息:%v\n",err)
			return
		}
		fmt.Print(line)							//line是根据上面'\n'风格的单行内容
	}
}

func main() {
	readByBufio()
}

ioutil 读取整个文件

  • io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。
  • 不要用 ioutil 读取太大的文件,容易撑爆内存
package main

import (
	"fmt"
	"io/ioutil"
)

func readByIoutil() {
	content,err := ioutil.ReadFile("xxx.txt")	//返回content是字节byte类型
	if err != nil {
		fmt.Printf("打开文件失败,错误信息:%v\n",err)
		return
	}
	fmt.Println(string(content))	//将content字节byte类型 转换 为string
}

func main() {
	readByIoutil()
}

文件写入 os.OpenFile()

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
	...
}

(name string, flag int, perm FileMode) 这三个参数分别代表 :

  • name:要打开的文件名
  • flag:打开文件的模式。
    • 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。

Write() 和 WriteString()

package main

import (
	"fmt"
	"os"
	"time"
)

func write(){
	//写入模式: os.O_CREATE|os.O_WRONLY|os.O_APPEND :创建,写入,追加
	//权限 0644
	fileObj,err := os.OpenFile("aaa.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
	if err != nil {
		fmt.Printf("打开文件失败,错误信息:%v\n",err)
		return
	}
	defer fileObj.Close()
	now_time := time.Now()
	ret1 := string(now_time.Format("2006-01-02 03:04:05"))	//时间类型转换str类型
	fileObj.Write([]byte(ret1))		//write 接收字节类型数据,str类型转换byte类型
	fileObj.WriteString("hello,alex")	//WriteString 接收字符串数据
}
func main() {
	write()
}

bufio.NewWriter

  • 会先写入缓存,然后通过 .Flush(),让数据再写入磁盘
package main

import (
	"bufio"
	"fmt"
	"os"
)

func writeByBufio(){
	//写入模式: os.O_CREATE|os.O_WRONLY|os.O_APPEND :创建,写入,追加
	//权限 0644
	fileObj,err := os.OpenFile("xxx.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
	if err != nil {
		fmt.Printf("打开文件失败,错误信息:%v\n",err)
		return
	}
	defer fileObj.Close()

	//写入
	writer := bufio.NewWriter(fileObj)
	writer.WriteString("alex")		//写入缓存中,还没落盘
	writer.Flush()						//从缓存写入磁盘
}

func main() {
	writeByBufio()
}

ioutil.WriteFile

  • 把字节类型数据直接写入文件
package main

import (
	"fmt"
	"io/ioutil"
)

func writeByIoutil(){
	str := "asdawdaasczxcas我命由我不由天"
	err := ioutil.WriteFile("xxx.txt",[]byte(str),0644)
	if err != nil {
		fmt.Printf("写入失败,错误信息为:%v\n",err)
		return
	}
}

func main() {
	writeByIoutil()
}