golang文件读取和写入https://www.cnblogs.com/-beyond/p/9203272.html

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值