package main import ( "io/ioutil" "fmt" "os" "bufio" "io" ) var ( filepath = "C:\\Users\\yangzhen1\\Desktop\\es10000Console_old\\src.txt" descpath = "D:\\goCodeWorkspace\\src\\github.com\\ks3sdklib\\aws-sdk-go\\test\\yz_test\\desc.txt" ) func main(){ //1/2/3 无论一次性读取还是一块块读取,都是读出来放在内存空间buffer里面 //1.利用io/ioutil包一次性读取一个文件的所有内容--ReadFile 获取[]byte //test_ioutil() //2.分多次连续读,每次读取指定长度的文件内容--Read //test_multi() //3.从指定位置开始读--Seek、ReadAt //seek_readat() //4.缓冲读bufio bufioRead() //获取文件元信息 //getFileinfo() //1.写入文件姿势1 ioutil.WriteFile //2.写入文件的姿势2 fd.writeat 或者连续写 //3.写入文件姿势3 bufferWrite 缓冲写注意flush } func getFileinfo(){ info,err := os.Stat("C:\\Users\\yangzhen1\\Desktop\\es10000Console_old\\src.txt") if err!= nil { panic(err) } fmt.Println(info.Name(),info.Size(),info.IsDir()) } func bufioRead(){ fd,err := os.Open("C:\\Users\\yangzhen1\\Desktop\\es10000Console_old\\src.txt") defer fd.Close() if err!=nil { panic(err) } fd2,err := os.OpenFile(descpath,os.O_RDWR,0666) defer fd2.Close() if err!=nil { panic(err) } reader := bufio.NewReader(fd) writer := bufio.NewWriter(fd2) linenum := 0 for { //line []byte, isPrefix bool, err error line, isPrefix , err := reader.ReadLine() if err!= nil && err != io.EOF { panic(err) } if isPrefix==false { linenum++ } fmt.Println(string(line)) _,err2 := writer.Write(line) if err2!= nil { panic(err) } if err == io.EOF { writer.Flush() fmt.Println("一共行数:",linenum) break } } } func seek_readat(){ fd,err := os.Open("C:\\Users\\yangzhen1\\Desktop\\es10000Console_old\\src.txt") defer fd.Close() if err!=nil { panic(err) } fd2,err := os.OpenFile(descpath,os.O_RDWR,0666) defer fd2.Close() if err!=nil { panic(err) } offset := int64(0) var buffersize int64 = 16//每次读取的偏移大小,也是buffer的大小 for { fmt.Println("offset:", offset) buffer := make([]byte,buffersize) len,err := fd.ReadAt(buffer,int64(offset))//关键在这一行,指定位置读取 fmt.Println("fd.readAt读取的len:",len,"\n内容:",string(buffer)) _,err = fd2.WriteAt(buffer,int64(offset)) if err!= nil { panic(err) } if len<int(buffersize) { break } //重新设定读取的指针 offset,err = fd.Seek(buffersize,1) if err!= nil { panic(err) } } } func test_multi() { fd,err := os.OpenFile(filepath,os.O_RDWR,0666) fd2,err := os.OpenFile(descpath,os.O_RDWR,0666) defer fd.Close() defer fd2.Close() if err!= nil { panic(err) } for { //如果执行多次从文件中读取,那么后面一次读取都会在前面一次读取结束的位置那里接着继续读 buffer := make([]byte,4096) //把文件内容读入内存buffer length,err := fd.Read(buffer) if err!=nil { panic(err) } fmt.Println("连续fd.read读取了长度",length,"\n内容:",string(buffer)) _,err = fd2.Write(buffer) if err != nil { panic(err) } if length<4096 { break } } } func test_ioutil(){ //或者 fd,err := os.openfile() // 然后ioutil.ReadAll(fd) bytesData,err := ioutil.ReadFile(filepath) if err!=nil{ panic(err) } fmt.Println("ioutil读取文件结束,大小:",len(bytesData),"\n内容:",string(bytesData)) //写文件 fd,err := os.Open(filepath) defer fd.Close() if err!= nil { panic(err) } contents,err := ioutil.ReadAll(fd) if err!= nil { panic(err) } err = ioutil.WriteFile(descpath,contents,0666) if err!= nil { panic(err) } }
golang文件读取和写入https://www.cnblogs.com/-beyond/p/9203272.html
最新推荐文章于 2024-01-05 14:32:20 发布