首页 > 后端开发 > Golang > Go语言怎么读取文件?多种方式浅析

Go语言怎么读取文件?多种方式浅析

青灯夜游
发布: 2023-04-20 18:28:45
转载
3935 人浏览过

Go语言怎么读取文件?多种方式浅析

这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。

  • os 包提供了一个独立于平台的接口来执行操作级操作。
  • IOutil 软件包提供了易于使用的实用程序函数来处理文件,而无需了解太多内部实现。
  • bufio 包实现了缓冲 IO,这有助于我们提高输入和输出操作的性能和吞吐量。
  • log 包实现一个简单的日志记录包。我们将在整个程序中使用它。我们将在程序中使用日志包的 Fatal() 函数。

整个文件读取

我们可以很容易地一次性读取整个文件并将其存储在一个变量中。但请记住,我们不应该对大文件这样做。我们将使用ioutil.ReadFile() 函数来读取文件并将文件的内容存储在一个变量中。

首先,让我们在我们程序所在的同一目录下存储一个文件。因此,我们的文件夹结构将是下面这样的。

1

2

3

4

___

|

|_ _ _ _ ilovego.txt |

|_ _ _ _ main.go

登录后复制

我们在 main.go 函数中写入如下的内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package main

 

import (

    "fmt"

    "io/ioutil"

    "log"

)

 

func main() {

 

    content, err := ioutil.ReadFile("ilovego.txt")

 

    if err != nil {

        log.Fatal(err)

    }

 

    fmt.Println(string(content))

}

登录后复制

但首先,让我们讨论一下 ReadFile() 函数的情况:

  • 定义:方法声明 func ReadFile(filename string) ([]byte, error)
  • 功能:读取路径被传入函数参数的文件,并返回文件的内容。在内部使用 os.ReadFile(fileName) 方法
  • 返回:在一个字节数组中返回文件的内容和错误。一个成功的调用将返回 err == nil

内部 ReadFile 函数实现如下:

1

2

3

func ReadFile(filename string) ([]byte, error) {

    return os.ReadFile(filename)

}

登录后复制

现在,让我们回到我们的程序:

  • ioutil.ReadFile("readthisfile.txt") 返回一个 byteArray 和一个 err。我们将byteArray 存储在 "content "变量中,错误存储在 " err "变量中。
  • 然后我们放置了一个 if 条件,如果 err 值不为 nil,我们将使用 log.Fatal() 函数打印错误 err 。记住,Fatal() 函数等同于 Print() 函数,然后调用 os.Exit(1)
  • 最后,我们将使用 fmt.Println() 函数打印文件的内容。 我们不能简单地打印 content 变量,因为它是一个字节数组,我们需要将它转换为字符串: string(content)

然后新建一个 ilovego.txt 文件,写入如下内容:

1

2

I Love Golang,

This is One of the Best Languages on the World!

登录后复制

最后,执行上述代码,可以看到如下输出:

1

2

3

$ go run main.go

I Love Golang,

This is One of the Best Languages on the World!

登录后复制

按行读取

Scanner 扫描器提供了一个方便的接口来读取数据,比如一个由新行分隔的文本行组成的文件。它通过标记来读取数据;Split 函数定义了标记。默认情况下,该函数将数据分成几行,并剥离了行端。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

package main

 

import (

    "fmt"

    // "io/ioutil"

    "bufio"

    "log"

    "os"

)

 

func main() {

 

    // opening the file using Open function

    f, err := os.Open("ilovego.txt")

 

    if err != nil {

        log.Fatal(err)

    }

 

    defer f.Close()

 

    // create a scanner for the file

    scanner := bufio.NewScanner(f)

 

    // loop through the scanner until it return fasle

    for scanner.Scan() {

 

        fmt.Println(scanner.Text())

    }

 

    if err := scanner.Err(); err != nil {

        log.Fatal(err)

    }

}

登录后复制
  • os.Open() 打开参数中传递的文件。如果在打开文件时遇到任何错误,它将返回同样的错误。否则,错误将是 nil。
  • 然后,我们使用扫描器来读取文件,并逐行扫描,直到文件内容结束。
  • 最后,我们要关闭该文件。

执行程序,结果如下:

Go语言怎么读取文件?多种方式浅析

逐个单词读取

我们还可以通过逐个单词来读取文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package main

 

import (

    "bufio"

    "fmt"

    "os"

)

 

func main() {

 

    f, err := os.Open("ilovego.txt")

 

    if err != nil {

        fmt.Println(err)

    }

 

    defer f.Close()

 

    scanner := bufio.NewScanner(f)

    scanner.Split(bufio.ScanWords)

 

    for scanner.Scan() {

 

        fmt.Println(scanner.Text())

    }

 

    if err := scanner.Err(); err != nil {

        fmt.Println(err)

    }

}

登录后复制

运行代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$ go run main.go

I

Love

Golang,

This

is

One

of

the

Best

Languages

on

the

World!

登录后复制

以数据块的形式读取文件

一次性读取整个文件似乎是一种简单的方法,但有时我们需要从内存管理的角度使我们的程序得到一些优化。Golang 提供了一种分块读取文件的方法,而不是整个或甚至逐行读取。因为如果一行的大小太大,逐行读取也可能是低效的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

package main

 

import (

    "bufio"

    "fmt"

    "io"

    "log"

    "os"

)

 

func main() {

 

    f, err := os.Open("ilovego.txt")

 

    if err != nil {

        log.Fatal(err)

    }

 

    defer f.Close()

 

    reader := bufio.NewReader(f)

    buf := make([]byte, 16)

 

    for {

                // reading a file upto buffer

        n, err := reader.Read(buf)

 

        if err != nil {

 

            if err != io.EOF {

 

                log.Fatal(err)

            }

 

            break

        }

 

        fmt.Print(string(buf[0:n]))

    }

 

    fmt.Println()

}

登录后复制

二进制读取

hex 包实现了十六进制的编码和解码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

package main

 

import (

    "bufio"

    "encoding/hex"

    "fmt"

    "io"

    "log"

    "os"

)

 

func main() {

 

    f, err := os.Open("sid.jpg")

 

    if err != nil {

        log.Fatal(err)

    }

 

    defer f.Close()

 

    reader := bufio.NewReader(f)

    buf := make([]byte, 256)

 

    for {

        _, err := reader.Read(buf)

 

        if err != nil {

            if err != io.EOF {

                fmt.Println(err)

            }

            break

        }

 

        fmt.Printf("%s", hex.Dump(buf))

    }

}

登录后复制

总结

本文介绍了 Go 语言读取文件的几种方式,ioutil.ReadFile 函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。希望能对你有所帮助!

推荐学习:Golang教程

以上是Go语言怎么读取文件?多种方式浅析的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
双语言或多语言网站怎么做?
来自于 1970-01-01 08:00:00
0
0
0
objective-c - iOS9如何设置默认国际化语言
来自于 1970-01-01 08:00:00
0
0
0
这个是Java语言的吗
来自于 1970-01-01 08:00:00
0
0
0
php是世界上最好的语言
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板