跳转到主要内容

注意 - 如果你对在 Go 中使用 JSON 感兴趣,你可能也喜欢我的其他教程 - Go JSON 教程

在本教程中,我们将了解如何使用 go 编程语言有效地读取和写入文件系统中的文件。

我们将用于读取和写入这些文件的方法将与文件格式无关。这意味着您将能够使用我们将介绍的技术来读取和写入 .txt、.csv、.xls 等,这些文件的唯一不同之处在于其结构您写入每种文件类型的数据。

读取文件


为了读取本地文件系统上的文件,您必须使用 io/ioutil 模块。您首先必须通过调用 ioutil.ReadFile("/path/to/my/file.ext") 将文件的内容拉入内存,这将获取您希望读取的文件的路径唯一的参数。这将返回文件的数据,或者可以像您通常处理 go 中的错误一样处理的错误。

创建一个名为 main.go 的新文件以及另一个名为 localfile.data 的文件。将一段随机文本添加到 .data 文件中,以便我们完成的 go 程序可以读取一些内容,然后执行以下操作:

package main

// import the 2 modules we need
import (
    "fmt"
    "io/ioutil"
)

func main() {
    // read in the contents of the localfile.data
    data, err := ioutil.ReadFile("localfile.data")
    // if our program was unable to read the file
    // print out the reason why it can't
    if err != nil {
        fmt.Println(err)
    }

    // if it was successful in reading the file then
    // print out the contents as a string
    fmt.Print(string(data))

}

将此 go 代码添加到 main.go 文件后,请尝试通过调用来运行它:

> go run main.go
this has all my content%


如您所见,我们已经成功地读取了存储在我们专有的 localfile.data 文件类型中的所有数据。

将文件写入新文件


现在我们已经介绍了在 Go 中读取文件,是时候看看创建和写入我们自己的文件了!

为了使用 Go 将内容写入文件,我们必须再次利用 io/ioutil 模块。我们首先必须构造一个字节数组来表示我们希望存储在文件中的内容。

mydata := []byte("all my data I want to write to a file")


一旦我们构建了这个字节数组,我们就可以调用 ioutil.WriteFile() 将这个字节数组写入文件。 WriteFile() 方法接受 3 个不同的参数,第一个是我们要写入的文件的位置,第二个是我们的 mydata 对象,第三个是 FileMode,它代表我们文件的模式和权限位。

// the WriteFile method returns an error if unsuccessful
err := ioutil.WriteFile("myfile.data", mydata, 0777)
// handle this error
if err != nil {
  // print it out
  fmt.Println(err)
}

让我们扩展我们原来的 main.go 文件,不仅可以读取,还可以写入文件:

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {

    mydata := []byte("All the data I wish to write to a file")

    // the WriteFile method returns an error if unsuccessful
    err := ioutil.WriteFile("myfile.data", mydata, 0777)
    // handle this error
    if err != nil {
        // print it out
        fmt.Println(err)
    }

    data, err := ioutil.ReadFile("myfile.data")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Print(string(data))

}

如果您现在尝试通过调用 go run main.go 来运行它,您应该会看到在您的当前目录中自动创建了一个名为 myfile.data 的新文件,并且我们的 go 程序继续从这个新创建的文件中读取并打印内容控制台:

➜ go run main.go
All the data I wish to write to a file


写入现有文件


如果我们有一个想要写入附加信息的现有文件会发生什么?

现在让我们来看看。

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {

    mydata := []byte("All the data I wish to write to a file\n")

    // the WriteFile method returns an error if unsuccessful
    err := ioutil.WriteFile("myfile.data", mydata, 0777)
    // handle this error
    if err != nil {
        // print it out
        fmt.Println(err)
    }

    data, err := ioutil.ReadFile("myfile.data")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Print(string(data))

    f, err := os.OpenFile("myfile.data", os.O_APPEND|os.O_WRONLY, 0600)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    if _, err = f.WriteString("new data that wasn't there originally\n"); err != nil {
        panic(err)
    }

    data, err = ioutil.ReadFile("myfile.data")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Print(string(data))

}

现在您已经添加了新代码,我们可以通过运行我们的 main.go 文件来测试它:

$ go run main.go
All the data I wish to write to a file
new data that wasn't there originally


瞧!我们已经成功地使用 os.OpenFile 和 f.WriteString() 方法附加到现有文件。

文件权限


当您写入新文件时,了解您可用的各种不同文件权限非常重要。

注意 - 有关权限的更深入的文档,我建议查看:https://golang.org/pkg/os/#FileMode

结论


如果您了解在 Go 中读取和写入文件的基础知识,那么您就掌握了读取和写入任何可能的文件类型的基础知识,无论是 CSV、PNG 还是某些专有数据格式。您只需要知道这些数据的结构,以便您可以解析和修改以满足您的需求。

这就是我们将在本教程中介绍的全部内容,我们已经设法研究了一种非常简单的数据格式的读写。然后我们简要地查看了文件权限。

文章链接