zoukankan      html  css  js  c++  java
  • Golang基础之文件操作

    0、前言

    在大多数语言中对于文件操作是必不可少的一个内容,那么在Go中os提供了文件的基本操作,除此以外为了追求便捷以及性能之上,Go 还在io/ioutil以及bufio提供一些其他函数供开发者使用

    1、文件读取

    1.1、os.open文件读取

    os.open打开文件后赋给file然后通过read的方法读取并接收一个buf []byte 的参数类型,读取到文件末尾会返回0以及 io.EOF,可以通过0或者io.EOF进行判断文件是否读取完毕。

    package main
    
    import (
    	"fmt"
    	"os"
    )
    
    func main(){
    	fileObj,err := os.Open("./main.go")
    	if err != nil{
    		fmt.Printf("open file failed err: %v",err)
    		return
    	}
    	// 记得关闭文件
    	defer fileObj.Close()
    	// 使用Read方法读取文件数据
    	//var tmp = make([]byte,128) // 指定读的长度
    	var tmp [128]byte
    	n,err := fileObj.Read(tmp[:])
    	if err != nil{
    		fmt.Printf("read from file failed err: %v",err)
    		return
    	}
    	fmt.Printf("读了%d个字节
    ",n)
    	fmt.Println(string(tmp[:n]))
    }
    

    1.2、os.open循环读取

    上面这种方式是一次性读取128byte的文件,如果需要将文件都读取完,就需要用到循环读取

    package main
    
    import (
    	"fmt"
    	"os"
    )
    
    func main(){
    	fileObj,err := os.Open("./main.go")
    	if err != nil{
    		fmt.Printf("open file failed err: %v",err)
    		return
    	}
    	defer fileObj.Close()
    	// 使用Read方法读取文件数据
    	var tmp [128]byte
    	for {
    		n,err := fileObj.Read(tmp[:])
    		if err != nil{
    			fmt.Printf("read from file failed err: %v",err)
    			return
    		}
    		fmt.Printf("读了%d个字节
    ",n)
    		fmt.Println(string(tmp[:n]))
    		if n < 128 {
    			return
    		}
    	}
    }
    

    1.3、bufio文件读取

    bufio 顾名思义就是带 buffer 的 IO

    package main
    
    import (
    	"bufio"
    	"fmt"
    )
    
    func main(){
    	fileObj,err := os.Open("./main.go")
    	if err != nil{
    		fmt.Printf("open file failed err: %v",err)
    		return
    	}
    	defer fileObj.Close()
    	// 创建一个从文件中读内容的对象
    	reader := bufio.NewReader(fileObj)
    	line,err := reader.ReadString('
    ')   //注意是字符
    	if err == io.EOF {
    		return
    	}
    	if err != nil{
    		fmt.Printf("read line failed,err: %v",err)
    		return
    	}
    	fmt.Print(line)
    }
    

    1.4、bufio循环读取

    package main
    
    import (
    	"bufio"
    	"fmt"
    )
    
    func main(){
    	fileObj,err := os.Open("./main.go")
    	if err != nil{
    		fmt.Printf("open file failed err: %v",err)
    		return
    	}
    	defer fileObj.Close()
    	// 创建一个从文件中读内容的对象
    	reader := bufio.NewReader(fileObj)
    	for {
    		line,err := reader.ReadString('
    ') //注意是字符
    		if err == io.EOF {
    			return
    		}
    		if err != nil{
    			fmt.Printf("read line failed,err: %v",err)
    			return
    		}
    		fmt.Println(line)
    	}
    }
    

    1.5、ioutil读取整个文件

    io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    )
    
    func main(){
    	ret,err := ioutil.ReadFile("./main.go")
    	if err != nil {
    		fmt.Printf("read line failed,err: %v",err)
    		return
    	}
    	fmt.Println(string(ret))
    }
    

    2、文件写入

    2.1、os.OpenFile文件写入

    os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能,它还提供了WriteString和Write两种方法,具体使用哪种根据个人需求。如下

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

    其中:
    1.name:要打开的文件名
    2.flag:打开文件的模式。模式有以下几种:

    模式 描述
    os.O_WRONLY 只写
    os.O_CREATE 创建文件
    os.O_RDONLY 只读
    os.O_RDWR 读写
    os.O_TRUNC 清空
    os.O_APPEND 追加

    3.perm:文件权限,一个八进制数,r(读) 04、w(写) 02、x (执行) 01

    package main
    
    import (
    	"fmt"
    	"os"
    )
    
    func main(){
    	file,err := os.OpenFile("a.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
    	if err != nil{
    		fmt.Printf("open file failed err:%v",err)
    		return
    	}
    	defer file.Close()
    	str := "hello world
    "
    	file.Write([]byte(str)) // 写入字节切片数据
    	file.WriteString(str) 	// 直接写入字符串数据
    }
    

    2.2、bufio.NewWriter文件写入

    bufio能够实现先将数据写入到缓存区,然后在从缓存中的内容写入到文件中。

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"os"
    )
    
    func main(){
    	file,err := os.OpenFile("a.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
    	if err != nil{
    		fmt.Printf("open file failed err:%v",err)
    		return
    	}
    	defer file.Close()
    
    	writer := bufio.NewWriter(file)
    	str := "我的世界,由我做主
    "
    	writer.WriteString(str) // 先将数据写入到缓存
    	writer.Flush() // 将缓存中的内容写入文件中
    }
    

    2.3、ioutil.WriteFile文件写入

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    )
    
    func main(){
    	 str := "我的世界,你的世界
    "
    	 err := ioutil.WriteFile("a.txt",[]byte(str),0666)
    	 if err != nil {
    		 fmt.Printf("open file failed err:%v",err)
    		 return
    	 }
    }
    
  • 相关阅读:
    promise思考
    思考
    前端命名规范化
    location的属性
    underscore里面的debounce与throttle
    nginx使用
    js原形链
    JS中常遇到的浏览器兼容问题和解决方法
    用js刷题的一些坑
    从mixin到new和prototype:Javascript原型机制详解
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/12317230.html
Copyright © 2011-2022 走看看