目录前言整个文件读取按行读取逐个单词读取以数据块的形式读取文件二进制读取总结前言 这篇文章将讨论如何在 golang 中读取文件。我们将使用以下包来处理这些文件。 os 包提供了一个
这篇文章将讨论如何在 golang 中读取文件。我们将使用以下包来处理这些文件。
Fatal()
函数。我们可以很容易地一次性读取整个文件并将其存储在一个变量中。但请记住,我们不应该对大文件这样做。我们将使用ioutil.ReadFile()
函数来读取文件并将文件的内容存储在一个变量中。
首先,让我们在我们程序所在的同一目录下存储一个文件。因此,我们的文件夹结构将是下面这样的。
我们在 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()
函数的情况:
ReadFile(filename string) ([]byte, error)
os.ReadFile(fileName)
方法内部 ReadFile 函数实现如下:
func ReadFile(filename string) ([]byte, error) {
return os.ReadFile(filename)
}
现在,让我们回到我们的程序:
ioutil.ReadFile("readthisfile.txt")
返回一个 byteArray 和一个 err。我们将byteArray 存储在 "content "变量中,错误存储在 " err "变量中。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))
}
}
本文介绍了 Go 语言读取文件的几种方式,ioutil.ReadFile
函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。
到此这篇关于Go语言读取文件的四种方式的文章就介绍到这了,更多相关Go 读取文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Go语言读取文件的四种方式
本文链接: https://lsjlt.com/news/208905.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0