玩转GO语言之文件读写操作

1.文件的打开,关闭

//1.打开文件
fp, err := os.Open("/Users/yangtao/go_lesson/test.txt")
if err != nil {
   fmt.Println("打开失败")
}else {
   fmt.Println("打开成功")
   fmt.Println(fp)
}

//2.关闭文件
defer func() {
   if err := fp.Close(); err != nil {
      fmt.Println("关闭文件失败")
   }else {
      fmt.Println("文件关闭成功")
   }
}()

//3.文件信息获取
finfo, err := os.Stat("/Users/yangtao/go_lesson/test.txt")
if err != nil {
   fmt.Println(err)
}else{
   //fmt.Println(finfo)
   fmt.Println(finfo.Name())
   fmt.Println(finfo.Size())
   fmt.Println(finfo.ModTime())
   fmt.Println(finfo.IsDir())
}复制代码

2.文件的读取操作

//4.读取文件第一种方式
buff := make([]byte,7)
for{
   len, err := fp.Read(buff)
   if len <= 0 || err != nil {
      break;
   }
   fmt.Print(string(buff[:len]))

}

总结:	通过os包中的Read函数读取
	func (f *File) Read(b []byte) (n int, err error)
	Read函数会将读取到的数据放到指定的切片中, 并且会一次性将所有的数据都读取进来
	会将读取到的byte个数返回给我们, 并且还会返回一个error,
	如果读取成功, 那么error等于nil, 如果读取失败那么error就不等于nil



复制代码
r := bufio.NewReader(fp)

//第二种方式
str, err := r.ReadString('\n')
if(err != nil){
   fmt.Println("读取失败")
}else{
   fmt.Print(str)
}

//第三种方式
buff, err1 :=  r.ReadBytes('6')
if(err1 != nil){
   fmt.Println("读取失败")
}else{
   fmt.Println(string(buff))
}

总结:	// 创建缓冲区
	// 将打开的文件句柄传递给NewReader函数, 会返回一个新的句柄
	// 缓冲区默认的大小是4096
	// 利用缓冲区的句柄来读取数据
	// 接收一个参数, 这个参数用于告诉ReadBytes函数, 读取到什么地方接收
	// 会将读取到的数据放到一个切片中返回给我们
复制代码
//第四种方式
buf, err := ioutil.ReadFile("/Users/yangtao/go_lesson/test.txt")
if err != nil{
   fmt.Println("读取失败")
}else{
   fmt.Println(string(buf))
}

总结:	第四种读取的方式:
	通过bufio包中的Read函数读取
	 // 会将指定路径中的文件一次性读取进来
	 // 接收一个参数: 用于传递需要读取的文件路径
	 // 返回两个值:
	 // 第一个返回值: 读取到的数据
	 // 第二个返回值: 读取失败就不等于nil复制代码

3.文件的写操作

//1.写入文件第一种方式
fp, err := os.Create("/Users/yangtao/go_lesson/test.txt")
if err != nil{
   fmt.Println("打开文件失败")
   return
}
// 2.关闭文件
defer func() {
   if err = fp.Close(); err !=nil{
      fmt.Println("关闭文件失败")
   }
}()

buf := []byte{'l','n','j','\r','\n'}
len, err1 :=  fp.Write(buf)
if err1 !=nil{
   fmt.Println("写入失败")
}else{
   fmt.Println("写入成功, 写入了", len, "个字节")
}

总结:	 
	  注意点: Open函数打开的文件只能读取, 不能写入
	  fp, err := os.Open("D:/lnj.txt")
	  Create函数的作用: 创建一个文件
	  注意点: 文件不存在, 会自动创建一个新的
	         文件存在, 会覆盖以前的(相当于创建了一个新的替换掉了以前的旧的)复制代码
//1.写入文件第二种方式
fp, err := os.Create("/Users/yangtao/go_lesson/test.txt")
if err != nil{
   fmt.Println("打开文件失败")
   return
}
// 2.关闭文件
defer func() {
   if err = fp.Close(); err !=nil{
      fmt.Println("关闭文件失败")
   }
}()

// 3.创建一个写入缓冲区
w :=bufio.NewWriter(fp)

//4.写入数据
len, err := w.WriteString("www.baidu.com\r\n")
if err != nil{
   fmt.Println("写入失败")
}else{
   fmt.Println("写入成功, 写入了", len, "个字节")
}

// 注意点:
// 如果通过带缓冲区的方式写入数据, 那么必须在写入完毕之后刷新一下缓冲区, 才会将缓冲区中的数据真正的写入到文件中
w.Flush()复制代码
/*
第三种写入的方式:
通过ioutil包中的Write和WirteString函数读取
   */
buf := []byte{'l','n','j','\r','\n'}
err := ioutil.WriteFile("/Users/yangtao/go_lesson/test.txt", buf, 0666)
if err != nil{
   fmt.Println("写入数据失败")
}else{
   fmt.Println("写入数据成功")
}复制代码

4.文件读写

func main() {
   /*
   os包中的Open函数只能读取不能写入
   os包中的Create函数可以读取也可以写入, 但是每次执行都会覆盖原有的文件, 每次执行都是一个空文件
   所以: 如果想要往文件中追加数据, 利用如上两个方法是不行的
   所以: 需要通过os包中的另一个函数: OpenFile

   作用: 打开一个文件, 并且文件不存在可以创建(注意是可以不是自动)
   第一个参数: 需要打开文件的路径
   第二个参数: 以什么模式打开文件 (只读/只写/可读可写/追加/)
            模式可以同时指定多个, 多个之间使用|分隔, 例如 O_CREATE | O_WRONLY
   第三个参数: 指定文件的权限, 只对Linux系统有效, 在Windows下无效

   func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

   const (
      O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
      O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
      O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
      O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
      O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
      O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
      O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
      O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
   )

   0.没有任何权限
   1.执行权限(如果是可执行程序, 可以运行)
   2.写权限
   3.写权限和执行权限
   4.读权限
   5.读权限和执行权限
   6.读权限和写权限
   7.读权限和写权限以及执行权限
   一般情况下写 0666

   注意点: OpenFile和Open函数一样, 打开文件之后需要手动关闭文件
    */

   fp, err := os.OpenFile("/Users/yangtao/go_lesson/test.txt", os.O_APPEND | os.O_RDWR, 0666)
   if err != nil{
      fmt.Println("创建失败")
   }else{
      fmt.Println(fp)
   }
   defer func() {
      if err := fp.Close(); err != nil{
         fmt.Println("关闭文件失败")
      }
   }()

   //len, err := fp.WriteString("www.itzb.com")
   //if err != nil{
   // fmt.Println("写入数据失败")
   //}else{
   // fmt.Println("写入成功, 写入了", len, "个字节")
   //}

   //buf := make([]byte, 1024)
   //_, err = fp.Read(buf)
   //if err != nil{
   // fmt.Println("读取数据失败")
   //}else{
   // fmt.Println(string(buf))
   //}

   w := bufio.NewWriter(fp)
   len , err := w.WriteString("\r\n123456")
   if err != nil{
      fmt.Println("写入数据失败")
   }else{
      fmt.Println("写入成功, 写入了", len, "个字节")
   }
   w.Flush()

}复制代码

代码:https://github.com/codeXiaoQiang/Go-language


转载于:https://juejin.im/post/5bbd942cf265da0af033a561

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值