«

Go语言如何读取文件

时间:2024-6-4 09:04     作者:韩俊     分类: Go语言


这篇文章主要讲解了“Go语言如何读取文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言如何读取文件”吧!

我们将使用以下包来处理这些文件。

    os 包提供了一个独立于平台的接口来执行操作级操作。

    IOutil 软件包提供了易于使用的实用程序函数来处理文件,而无需了解太多内部实现。

    bufio 包实现了缓冲 IO,这有助于我们提高输入和输出操作的性能和吞吐量。

    log 包实现一个简单的日志记录包。我们将在整个程序中使用它。我们将在程序中使用日志包的

    Fatal()
    函数。

整个文件读取

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

ioutil.ReadFile()
函数来读取文件并将文件的内容存储在一个变量中。

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

___ 
| 
|_ _ _ _ ilovego.txt | 
|_ _ _ _ main.go

我们在

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

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 函数实现如下:

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
文件,写入如下内容:

I Love Golang,
This is One of the Best Languages on the World!

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

$ go run main.go
I Love Golang, 
This is One of the Best Languages on the World!

按行读取

Scanner 扫描器提供了一个方便的接口来读取数据,比如一个由新行分隔的文本行组成的文件。它通过标记来读取数据;

Split
函数定义了标记。默认情况下,该函数将数据分成几行,并剥离了行端。

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。

    然后,我们使用扫描器来读取文件,并逐行扫描,直到文件内容结束。

    最后,我们要关闭该文件。

执行程序,结果如下:

逐个单词读取

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

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

运行代码:

$ go run main.go
I
Love
Golang,
This
is
One
of
the
Best
Languages
on
the
World!

以数据块的形式读取文件

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

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
包实现了十六进制的编码和解码。

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

标签: golang

热门推荐