Go语言程序:将文件转换为字节数组
在 Go 编程语言中,我们可以使用 `byte` 函数和 `ioutil.ReadFile` 函数将文件转换为字节数组。`os` 包中的文件类型提供了打开、读取、写入和操作文件的方法,而数组是由相同元素组成的固定大小的组,可以通过其各自的索引(基于零的整数)进行访问。数组的大小在声明时预先确定,以后无法更改。当存储一组具有已知元素数量的数据时,Go 中的数组非常方便,但它也有一些缺点,例如在调整数组大小时需要更多内存。
方法一:使用 `byte` 函数
此方法使用 `os` 包打开文件,使用 `bufio` 包从文件读取数据,然后使用 `fmt` 包打印字节数组。首先使用 `os` 打开文件。在 `open` 函数之后使用该文件。使用 `stat` 方法获取文件大小。之后,它使用该文件并创建一个与文件大小相同的字节切片。使用 `read` 方法将文件内容读取到字节切片中。最后打印出字节切片。
语法
Bufio.newReader
此函数属于 Go 的 `bufio` 包。此函数的主要目的是逐块读取数据而不是逐行读取,并将数据存储在缓冲区中。`io.reader` 和缓冲区大小作为参数传递给此函数。
算法
步骤 1 − 创建一个 `main` 包,并在程序中声明 `fmt`(格式化包)、`bufio`、`io` 和 `os` 包,其中 `main` 生成可执行代码,`fmt` 帮助格式化输入和输出。
步骤 2 − 使用 `os.Open` 函数打开文件并处理任何潜在的错误。
步骤 3 − 在下一步中,使用 `Stat` 方法检索文件元数据,然后将其保存到变量中。
步骤 4 − 根据元数据创建与文件大小相同的字节切片。
步骤 5 − 然后,使用 `bufio` 读取器将文件读取到字节切片中。
步骤 6 − 将文件读取到字节切片时,查找并处理任何错误。
步骤 7 − 文件的内容现在位于字节切片中,可以根据需要使用。
步骤 8 − `ioutil` 也可用于完成步骤 3 到 6。
步骤 9 − 使用 `ReadFile` 方法时,整个文件将被读取到字节切片中,然后连同可能发生的任何错误一起返回。
示例
在这个例子中,我们将使用 `byte` 函数将文件转换为字节数组。
package main import ( "bufio" "fmt" "io" "os" ) func main() { file, err := os.Open("filename.txt") if err != nil { fmt.Println(err) return } defer file.Close() // Get the file size stat, err := file.Stat() if err != nil { fmt.Println(err) return } // Read the file into a byte slice bs := make([]byte, stat.Size()) _, err = bufio.NewReader(file).Read(bs) if err != nil && err != io.EOF { fmt.Println(err) return } fmt.Println(bs) }
输出
[72 101 108 108 111 32 87 111 114 108 100 33]
方法二:使用 `ioutil.ReadFile` 函数
在下面的方法中,使用 `ioutil` 包将文件的完整内容读取到字节切片中。`ioutil.ReadFile` 函数在将整个文件的内容读取到内存后返回一个字节切片。如果读取文件时出现问题,应用程序将输出错误消息。然后,应用程序打印文件的内容,该内容以字节切片的形式显示为字节数组。让我们看一下代码和算法,看看如何执行此方法。
语法
Ioutil.ReadFile
此函数在 `ioutil` 包中可用,用于读取以文件名作为函数输入的文件的内容。
算法
步骤 1 − 创建一个 `main` 包,并在程序中声明 `fmt`(格式化包)、`io/ioutil` 包,其中 `main` 生成可执行代码,`fmt` 帮助格式化输入和输出。
步骤 2 − 使用 `ioutil.ReadFile` 函数将整个文件的内容读取到单个字节切片中。
步骤 3 − 检查读取文件时的任何错误。
步骤 4 − 打印文件的内容,该内容以字节切片形式表示为字节数组。
步骤 5 − 由于使用了 `ioutil`,此程序比之前的程序更短更简单。
步骤 6 − 使用 `ReadFile` 函数快速将文件的全部内容读取到内存中。
示例
在这个例子中,我们将使用 `ioutil.ReadFile` 函数将文件转换为字节数组。让我们来看一下代码。
package main import ( "fmt" "io/ioutil" ) func main() { v, err := ioutil.ReadFile("myfile.txt") //read the content of file if err != nil { fmt.Println(err) return } fmt.Println(v) //print the file content }
输出
[72 101 108 108 111 32 87 111 114 108 100 33]
结论
我们使用两个例子执行了将文件转换为字节数组的程序。在第一个例子中,我们使用了 `byte` 函数;在第二个例子中,我们使用了 `ioutil.ReadFile` 函数来执行程序。