go--文件的读写

package main

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

// 方法一:使用ioutil.ReadFile
func read1(){
	f,err:= ioutil.ReadFile("F:\\project\\src\\day7\\file")
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
	fmt.Println(string(f))  //ioutil.ReadFile默认是读取到[]byte中,一定要将f转化成字符串
}

// 方法二:使用os.Open(),file ->buf->[]byte
func read2(){
	// 获得文件句柄
	f,err:=os.Open("F:\\project\\src\\day7\\file")
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
	//压入栈中,以往忘记关闭
	defer f.Close()

	//用于存储文件字节
	var obj []byte

	//用于缓冲,表示可以容纳1024个字节
	buf := make([]byte,1024)

	for {
		n,err:=f.Read(buf) //表示将文件里的内容都读取到buf中,n为读取了多少字节
		if err!=nil && err!=io.EOF{ //当err既不为空,而且也不为io.EOF(如果文件读完了,会报这个错)
			fmt.Println("err=",err)
			return
		}
		if n==0{
			break  //文件读完了
		}

		//将buf里的文件写到用于存储的obj当中
		obj = append(obj,buf[:n]...)

	}
	fmt.Println(string(obj)) //转化为字符串打印

}

//方法三:os.Open(),file -> Reader -> buf -> []byte
func read3(){
	// 获得文件句柄
	f,err:=os.Open("F:\\project\\src\\day7\\file")
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
	//压入栈中,防止忘记关闭
	defer f.Close()

	f1 := bufio.NewReader(f)

	var obj []byte

	buf := make([]byte,1024)

	for {
		n,err:=f1.Read(buf) //内容都读取到buf里面去
		if err!=nil && err!=io.EOF{
			fmt.Println("err=",err)
		}

		if n==0{
			break //读完了,break出去
		}
		obj = append(obj,buf[:n]...)
	}
	fmt.Println(string(obj))
}

//方法四:两种方式结合,os.Open(),file -> []byte
func read4(){
	f,err:= os.Open("F:\\project\\src\\day7\\file")
	if err!=nil && err!=io.EOF{
		fmt.Println("err=",err)
		return
	}
	//之前是创建两个[]byte,obj用了存储文件,buf用于暂存,然后将暂存的文件忘obj里面搬
	//这里我们也不用创建储存文件的obj了,也不用再创建buf这个缓冲区了
	data,err:=ioutil.ReadAll(f) //直接将文件信息读取到data当中,但是读取的是byte,要转成字符串
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
	fmt.Println(string(data))
}

//最后一种方法是最快的

//使用io.WriteString()写入文件
func write1(){
	filename := "F:\\project\\src\\day7\\file2"
	//1.创建文件
	f,err:=os.Create(filename)
	if err!= nil{
		fmt.Println("err=",err)
		return
	}
	//将字符串写入文件
	//表示将mashiro写到f里面去
	//会有两个返回值,分别是写入的字节数和err
	n,err:=io.WriteString(f,"mashiro")
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
	//注意这里的n是字节数,不是字符的个数
	fmt.Println(n)
}

//使用ioutil.WriteFile()写入文件
func write2(){
	filename := "F:\\project\\src\\day7\\file2"
	//这里只能写入字节
	err:= ioutil.WriteFile(filename,[]byte("古明地盆"),0644)
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
}

//使用文件句柄写入文件

func write3(){
	filename := "F:\\project\\src\\day7\\file2"
	f,err:= os.Create(filename)
	if err!=nil{
		fmt.Println("err=",err)
		return
	}
	defer f.Close()
	//此方法写入字节类型,注意写入的虽然是字节,但打开文件看到的是字符串
	//go语言里没有那些各种编码,只有一个utf-8,这一点做的比Python好
	n,err:=f.Write([]byte("芙兰朵露斯卡雷特"))
	if err!=nil{
		fmt.Println("err=",err)
	}
	//n表示写入字节数
	fmt.Println(n) //24

	//也可以直接写入字符串
	n,err = f.WriteString("芙兰朵露斯卡雷特")
	if err!=nil{
		fmt.Println("err=",err)
	}
	fmt.Println(n) //24
}

//使用bufio.NewWriter()写入文件
func write4(){
	filename := "F:\\project\\src\\day7\\file2"
	f,err:= os.Create(filename)
	if err!=nil{
		fmt.Println("err=",err)
	}
	f1 := bufio.NewWriter(f)
	//f和f1的方法一样
	f1.WriteString("mmp")
	f1.Write([]byte("mmp"))

}

  

猜你喜欢

转载自www.cnblogs.com/traditional/p/9244974.html