13、go文件读取 和 写入

01、golang打开文件读出一块文件数据,但是数据读不全

--读取思路:
    --打开文件获取操作句柄
    --读入一段数据打印
    --defer 打开文件句柄之后,立即定义关闭函数
    --不论是 os.Open() 还是 file.Read 函数。返回的都有err,需要对err判断是否被打开 对err判断是否读取完毕 
--func Open(name string) (file *File, err error)
    --Open打开一个文件用于打开。返回对象为:
        --file:文件操作符,用于后续操作文件
        --err: 用于判断

--代码示例如下:
    func main(){
	    // 只读方式打开一个文件,获取文件操作句柄。希望能够通过闭包或上下文管理来完成函数
	    file, err := os.Open("test.txt")

	    if err != nil {  // 错误不为空,就是有错误
		    fmt.Println("open file failed", err)
		    return
	    }
	    defer file.Close()  // 定义文件关闭,以免忘记

	    // 通过句柄打开文件
	    var tmp = make([]byte, 128)
	    n, err01 := file.Read(tmp)
	    if err01 == io.EOF{
		    fmt.Println("文件读完了")
		    return
	    }
	    if err01 != nil{
		    fmt.Println("read file failed, err", err)
		    return
	    }
	    fmt.Printf("读取了%d字节的数据\n", n)
	    fmt.Println(string(tmp[:n]))
    }

02、golang打开文件循环读取:这是一次读取一块数据,全部文件数据

func main(){
	// 只读方式打开一个文件,获取文件操作句柄。希望能够通过闭包或上下文管理来完成函数
	file, err := os.Open("test.txt")

	if err != nil {  // 如果读取失败报错
		fmt.Println("open file failed", err)
		return
	}
	defer file.Close()  // 定义文件关闭,以免忘记

	// 通过句柄打开文件
	var content []byte
	var tmp = make([]byte, 128)
	for{
		n, err := file.Read(tmp)
		if err == io.EOF{  // 文件读完了
			fmt.Println("文件读完了")
			break
		}
		if err != nil{  // 文件读完且没有出错
			fmt.Println("读取文件出错了")
			return
		}
		content = append(content, tmp[:n]...)  // 这个表示切片一次
	} 
	fmt.Println(string(content))
}

03、bufio读取文件 -- 逐行读取

func main(){
	// 只读方式打开一个文件,获取文件操作句柄[打开通道]。希望能够通过闭包或上下文管理来完成函数
	file, err := os.Open("test.txt")

	if err != nil {  // 如果读取失败报错
		fmt.Println("open file failed", err)
		return
	}
	defer file.Close()  // 定义文件关闭,以免忘记

	// 打开文件
	reader := bufio.NewReader(file)  // 获取文件地址
	for{
		line, err := reader.ReadString('\n')  // 按照\n切割字符串
		if err == io.EOF{
			if len(line) != 0{
				fmt.Println(line)
			}
			fmt.Println("文件读取完毕")
			break
		}
		if err != nil{
			fmt.Println("读文件报错", err)
			return
		}
		fmt.Println(line)
	}
}

04、ioutil -- 读取整个文件,只需要传入文件地址即可

	// 打开文件读入通道
	content, err := ioutil.ReadFile("test.txt")

	if err!=nil{
		fmt.Println("read file error", err)
		return
	}
	fmt.Println(string(content))

05、文件写入 -- os.OpenFile()函数

--os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
    func OpenFile(name string, flag int, perm FileMode) (*File, error) {
	    ...
    }
        --name:要打开的文件名 
        --flag:打开文件的模式
        --perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。在Linux中就是文件权限,例如777。这个参数对于windows系统没有意义

--模式有以下几种:
    模式                    含义        --    对应常数
    os.O_WRONLY	    --      只写        --    0x00001
    os.O_CREATE	    --      创建文件    --    0x00040
    os.O_RDONLY	    --      只读        --    0x00000
    os.O_RDWR	    --      读写        --    0x00002
    os.O_TRUNC	    --      清空        --    0x00200
    os.O_APPEND	    --      追加        --    0x00400

--在go语言中标志位类型为int,通过标志位之间的 | 操作,并按照二进制位上的1来判断有哪些模式被启用

--如果文件不存在且要写入时,会报错如下:
    open file failed open write_in.txt: The system cannot find the file specified.
--Write和WriteString
    --Write:按照字节写入
    --WriteString:按照字符串写入

--代码示例:
    func main(){
	    // 准备写入文件时需要设定不同的模式
	    fileObj, err := os.OpenFile("write_in.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)

	    if err != nil{
		    fmt.Println("open file failed", err)
		    return
	    }
	    defer fileObj.Close()  // 关闭文件

	    // Write
	    fileObj.Write([]byte("不惭于景\n"))
	    // WriteString
	    fileObj.WriteString("慎其独也")
    }
--bufio.NewWriter
    --逐行读入

--代码示例:
    func main(){
	    // 准备写入文件时需要设定不同的模式
	    fileObj, err := os.OpenFile("write_in.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)

	    if err != nil{
		    fmt.Println("open file failed", err)
		    return
	    }
	    defer fileObj.Close()  // 关闭文件

	    writer := bufio.NewWriter(fileObj)
	    for i := 0; i < 1000; i++ {
		    writer.WriteString("hello沙河\n") //将数据先写入缓存
	    }
	    writer.Flush() //将缓存中的内容写入文件
    }
--ioutil.WriteFile
    --更加高级的写入函数

--代码示例如下:    
    str := "hello 沙河"
	err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
	if err != nil {
		fmt.Println("write file failed, err:", err)
		return
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值