这篇文章主要介绍了Go语言读取文件的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言读取文件的方式有哪些文章都会有所收获,下面我们一起来看看吧。
整个文件读取
我们可以很容易地一次性读取整个文件并将其存储在一个变量中。但请记住,我们不应该对大文件这样做。我们将使用ioutil.ReadFile()
函数来读取文件并将文件的内容存储在一个变量中。
首先,让我们在我们程序所在的同一目录下存储一个文件。因此,我们的文件夹结构将是下面这样的。
___ | |_ _ _ _ ilovego.txt | |_ _ _ _ main.go
我们在 main.go
函数中写入如下的内容:
package mainimport ("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.goI Love Golang, This is One of the Best Languages on the World!
按行读取
Scanner 扫描器提供了一个方便的接口来读取数据,比如一个由新行分隔的文本行组成的文件。它通过标记来读取数据;Split
函数定义了标记。默认情况下,该函数将数据分成几行,并剥离了行端。
package mainimport ("fmt"// "io/ioutil""bufio""log""os")func main() {// opening the file using Open functionf, err := os.Open("ilovego.txt")if err != nil {log.Fatal(err)}defer f.Close()// create a scanner for the filescanner := bufio.NewScanner(f)// loop through the scanner until it return faslefor scanner.Scan() {fmt.Println(scanner.Text())}if err := scanner.Err(); err != nil {log.Fatal(err)}}
os.Open()
打开参数中传递的文件。如果在打开文件时遇到任何错误,它将返回同样的错误。否则,错误将是 nil。然后,我们使用扫描器来读取文件,并逐行扫描,直到文件内容结束。
最后,我们要关闭该文件。
执行程序,结果如下:
逐个单词读取
我们还可以通过逐个单词来读取文件:
package mainimport ("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.goILoveGolang,ThisisOneoftheBestLanguagesontheWorld!
以数据块的形式读取文件
一次性读取整个文件似乎是一种简单的方法,但有时我们需要从内存管理的角度使我们的程序得到一些优化。Golang 提供了一种分块读取文件的方法,而不是整个或甚至逐行读取。因为如果一行的大小太大,逐行读取也可能是低效的。
package mainimport ("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 buffern, 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 mainimport ("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语言读取文件的方式有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Go语言读取文件的方式有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。