Go语言基础(10)-- 文件流

十、文件流

10.1、读取文件

10.1.1、打开文件/关闭文件

os.Open()函数能够打开一文件,返回一个 ***File** 和一个**err**,对得到的文件实例调用close()方法能够关闭文件。

10.1.1、file.Read()

func (f *File) Read(b []byte) (n int, err error)
const A = 256
func main() {
  open, err := os.Open("./09接口.go")
  if err != nil {
   fmt.Println("未找到文件:", err)
  }
  defer open.Close()
  var bytes [**A**]byte
  for {
   n, err := open.Read(bytes[:])
   if err == io.EOF {
     fmt.Println("读取完毕:", err)
     return
   }
   if err != nil {
     fmt.Println("读取失败:", err)
     return
   }
   fmt.Println("读取了", n, "个字节")
   fmt.Println(string(bytes[:]))
   if n < **A** {
     return
   }
  }
}

10.1.2、bufio

func main() {
  open, err := os.Open("./09接口.go")
  if err != nil {
   fmt.Println("未找到文件:", err)
  }
  defer open.Close()
  reader := bufio.NewReader(open)
  for {
   readString, err := reader.ReadString('\n') //字符
   if err == io.EOF {
     fmt.Println("读取完毕:", err)
     return
   }
   if err != nil {
     fmt.Println("读取失败:", err)
     return
   }
   fmt.Print(readString)
  }
}

10.1.3、ioutil读取整个文件

func main() {
  file, err := ioutil.ReadFile("./09接口.go")
  if err != nil {
   fmt.Println("读取失败:", err)
   return
  }
  fmt.Println(string(file))
}

10.2、文件写入

10.2.1、os.OpenFile()

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
}

● name:要打开的文件名

● flag :打开文件的模式。模式有以下几种:

在这里插入图片描述

● perm:文件权限,一个八进制数。r (读) 04,w (写) 02,x (执行) 01。

10.2.2、write()与writeString()

file, err := os.OpenFile("file.txt", os.**O_CREATE**|os.**O_APPEND**|os.**O_WRONLY**,0666)
if err != nil {
  fmt.Println("打开错误:",err)
  return
}
defer file.Close()
str := "hello 世界"
file.Write([]byte(str))
file.WriteString("hello 你好")

在这里插入图片描述

10.2.3、bufio.NewWriter

func main() {
  file, err := os.OpenFile("file.txt", os.**O_CREATE**|os.**O_TRUNC**|os.**O_WRONLY**,0666)
  if err != nil {
   fmt.Println("打开错误:",err)
   return
  }
  defer file.Close()
  writer := bufio.NewWriter(file)
  str := "hello 世界"
  writer.WriteString(str)
  writer.Flush()
}

10.2.4、ioutil.WriteFile

func main() {
  str := "hello 世界a"
  err := ioutil.WriteFile("file.txt",[]byte(str),0666)
  if err != nil {
   fmt.Println("打开错误:",err)
   return
  }
}

10.3、使用bufio获取用户输入

bufio.NewReader的参数就是接口与类型

func main() {
  var s string
  reader := bufio.NewReader(os.Stdin)
  s, _ = reader.ReadString('\n')
  fmt.Println("输入的是:",s)
}

在这里插入图片描述

10.4、在文件中插入内容

func (f *File) Seek(offset int64, whence int) (ret int64, err error)

Seek设置下一次读/写的位置。

offset为相对偏移量。

whence决定相对位置: 0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。

10.4.1、指定位置读取

func main() {
  file, err := os.OpenFile("./file.txt", os.**O_RDWR**, 0644)
  if err != nil {
   fmt.Println("文件打开失败:",err)
   return
  }
  defer file.Close()
  file.Seek(1,0)//光标移动
  var ret [1]byte//
  n, err := file.Read(ret[:])//读一个字节
  if err != nil {
   fmt.Println("文件读取失败:",err)
   return
  }
  fmt.Println(string(ret[:n]))
}

在这里插入图片描述
在这里插入图片描述

10.4.2、指定位置写入(替换)

func main() {
  file, err := os.OpenFile("./file.txt", os.**O_RDWR**, 0644)
  if err != nil {
   fmt.Println("文件打开失败:", err)
   return
  }
  defer file.Close()
  file.Seek(1, 0) //光标移动
  ret := []byte{'5'}
  _, err = file.Write(ret[:])//写入
  if err != nil {
   fmt.Println("写入文件失败:", err)
   return
  }
}

写入前:

在这里插入图片描述

写入后:

在这里插入图片描述

注意:写入指定位置,会替换此位置原来的内容,没有办法在文件按中间插入内容。

10.4.3、指定位置追加

追加思路:

借助临时文件:新建一个文件,把追加之前的写进去,在写追加的内容,然后把追加之后的写进去。(个人建议直接把所有内容写好重新覆盖,比较简单)

10.5、练习

10.5.1、复制文件

func copyFile(dstName, srcName string) (written int64, err error) {
  srcFile, err := os.Open(srcName)
  if err != nil {
   fmt.Println("文件打开失败:", err)
   return 1, err
  }
  defer srcFile.Close()

  dstfile, err := os.OpenFile(dstName, os.**O_CREATE**|os.**O_TRUNC**|os.**O_WRONLY**, 0644)
  if err != nil {
   return 2, err
  }
  defer dstfile.Close()
  return io.Copy(dstfile, srcFile)
}
func main() {
  mode, err := copyFile("dis.txt", "file.txt")
  if err != nil {
   fmt.Println("文件复制失败:", err)
  }
  if mode == 1 {
   fmt.Println("失败原因:资源文件打开失败")
  } else if mode == 2 {
   fmt.Println("失败原因:复制的新文件创建失败")
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值