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")) }