前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >32.Go文本文件处理-读取文件

32.Go文本文件处理-读取文件

作者头像
Devops海洋的渔夫
发布2022-01-17 10:26:42
6110
发布2022-01-17 10:26:42
举报
文章被收录于专栏:Devops专栏

32.Go文本文件处理-读取文件

前言

上一篇章我们已经懂得如何写文件,下面来继续看看如何读取文件。

3 读取文件

Read() 函数 读取文件

如果文件已经存在,并且也已经有数据了,那么可以直接读取该文件中的内容。

读取文件的基本流程如下:

(1) 打开要读取的文件

(2) 对文件进行读取

(3) 关闭文件

在向文件中写数据的时候,使用的是Write,那么读取文件中的数据,使用的是Read.

关于Read( )函数的使用如下:

代码语言:javascript
复制
package main

import (
   "fmt"
   "io"
   "os"
)

func ReadFile(filePath string)  {
   //打开文件
   file, err := os.Open(filePath)
   if err != nil {
      fmt.Println("err = ", err)
      return
   }
   //关闭文件
   defer file.Close()

   //读取文件内容
   buf := make([]byte, 1024*2) // 2k大小
   n, err1 := file.Read(buf) //n代表从文件读取内容的长度
   if err1 != nil && err1 != io.EOF { // 文件出错,同时没有到结尾
      fmt.Println("err1 = ", err1)
      return
   }

   fmt.Println("buf = ", string(buf[:n])) // 输出文件内容
}

func main() {
   var filePath = "a.txt"
   ReadFile(filePath)
}

执行如下:

代码语言:javascript
复制
$ go run 02_读取文件.go
buf =  Hello World, i = 1
Hello World, i = 2
Hello World, i = 3
Hello World, i = 4
Hello World, i = 5
Hello World, i = 6
Hello World, i = 7
Hello World, i = 8
Hello World, i = 9
Openfile, i = 1
Openfile, i = 2
Openfile, i = 3
Openfile, i = 4
Openfile, i = 5
Openfile, i = 6
Openfile, i = 7
Openfile, i = 8
Openfile, i = 9

Open( )是打开文件,与OpenFile( )的区别是,Open( )只有读的权限

在使用Read( )函数读取文件中的内容时,需要一个切片类型,而定义切片时类型为字符数组,将文件中的内容保存在切片中,同时除了对其判断是否出错时以外,还要判断是否到文件末尾(这里需要导入io包)。

Read( )函数返回的是从文件中读取的数据的长度。最后,输出切片中存储的文件数据,注意,读取的是从最开始到整个数据长度,因为有可能存储到切片中的数据达不到切片的总长度(也是切片时2k,但是从文件中读取的数据有可能只有1k)

按行读取

上面我们是将文件的内容全部读取出来,然后存放在切片中,我们也可以每次只读取一行数据。

这需要用到bufio包中的ReadBytes函数。具体如下:

1:打开文件
代码语言:javascript
复制
//打开文件
file, err := os.Open(filePath)
if err != nil {
   fmt.Println("err = ", err)
   return
}
2:创建缓冲区

在使用 ReadBytes( ) 函数读取数据时,需要用到缓冲区,所谓缓冲区就是存储数据的区域,也就是先将从文件中读取的数据存储在该区域内,然后在将区域中的数据取出来,写到磁盘上。

提供缓冲区的原因是:

为了缓和 CPU 与 磁盘设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。

代码语言:javascript
复制
// 新建一个缓冲区,把内容先放在缓冲区
reader := bufio.NewReader(file)
3:循环读取文件中的内容,直到文件末尾位置。
代码语言:javascript
复制
// 循环读取文件中的内容,直到文件末尾位置
for {
   // 遇到'\n'结束读取,但是'\n' 也读取进入
   buf, err := reader.ReadBytes('\n')
   if err != nil {
      if err == io.EOF { // 文件已结束
         break
      }
      fmt.Println("err = ", err)
   }

   fmt.Printf("%s", string(buf)) // 输出每行内容
} 

在使用ReadBytes( )函数时,传递的参数是‘\n’,表示遇到’\n’就结束,所以使用了死循环(每循环一次,读取一行数据),只有到文件末尾了,才退出整个循环。最后,将读取的数据打印出来,注意ReadBytes( )返回的是字节切片,所以在打印时要转换成字符串。

4:最后关闭文件
代码语言:javascript
复制
//关闭文件
defer file.Close()
5: 完整代码调用
代码语言:javascript
复制
func ReadFileLine(filePath string)  {
   //打开文件
   file, err := os.Open(filePath)
   if err != nil {
      fmt.Println("err = ", err)
      return
   }

   // 新建一个缓冲区,把内容先放在缓冲区
   reader := bufio.NewReader(file)

   // 循环读取文件中的内容,直到文件末尾位置
   for {
      // 遇到'\n'结束读取,但是'\n' 也读取进入
      buf, err := reader.ReadBytes('\n')
      if err != nil {
         if err == io.EOF { // 文件已结束
            break
         }
         fmt.Println("err = ", err)
      }

      fmt.Printf("%s", string(buf)) // 输出每行内容
   }

   //关闭文件
   defer file.Close()
}

func main() {
   var filePath = "a.txt"
   ReadFileLine(filePath)
}

执行如下:

代码语言:javascript
复制
$ go run 02_读取文件.go
Hello World, i = 1
Hello World, i = 2
Hello World, i = 3
Hello World, i = 4
Hello World, i = 5
Hello World, i = 6
Hello World, i = 7
Hello World, i = 8
Hello World, i = 9
Openfile, i = 1
Openfile, i = 2
Openfile, i = 3
Openfile, i = 4
Openfile, i = 5
Openfile, i = 6
Openfile, i = 7
Openfile, i = 8
Openfile, i = 9

现在我们已经完成了文件的创建,读取,以及将数据保存到文件的操作,在对文件操作时,我们需要指定文件的路径。

关于路径,有两种情况:

第一:相对路径,所谓相对路径指的是文件相对于应用程序的路径。例如:上面我们一只使用的a.txt,这个文件,该文件存放的位置与可执行文件存储的路径是一样的。

第二:绝对路径:指的是通过给定的这个路径直接能在我的电脑中找到这个文件。例如:D:\\a.txt,

思考:大家认为我们以后在开发中使用相对路径还是绝对路径?并且说明原因

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 32.Go文本文件处理-读取文件
  • 前言
  • 3 读取文件
    • Read() 函数 读取文件
      • 按行读取
        • 1:打开文件
        • 2:创建缓冲区
        • 3:循环读取文件中的内容,直到文件末尾位置。
        • 4:最后关闭文件
        • 5: 完整代码调用
      • 关于路径,有两种情况:
      相关产品与服务
      文件存储
      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档