Go语言读取文件的方式有哪些

整个文件读取

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

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

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

执行程序,结果如下:

Go语言读取文件的方式有哪些

逐个单词读取

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

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

原创文章,作者:XVEPV,如若转载,请注明出处:https://www.beidanyezhu.com/a/31332.html

(0)
XVEPV的头像XVEPV
上一篇 2025-02-26
下一篇 2025-02-26

相关推荐

  • 简单装修(装修方式)

    有很多朋友在装修房子的时候,就是想把家里简单装修一下。但是,即使是简单装一下,也要满足我们日常的使用功能。像普通家庭的简单装修,一般包含了水电改造,墙面,地面,顶板的装修翻新,然后…

  • 视频(文件怎么压缩)

    1、大量文件压缩 工作和学习中我们都免不了要发送一些图片、文件、视频。像我们常用的微信、QQ、邮箱这些,在发送资料的时候都会有容量或者数目限制。超过容量大小或者数目个数都会导致资料…

  • 百度收录查询详细数据分析教程(xml文件怎么打开)

    网站收录的为什么这么重要? 网站的收录、排名以及流量都是SEO工作中重要的三个环节他们三个缺一不少,而且都是按照先后顺序进行的,网站要想有自然流量,收录是第一个重要的步骤,没有收录…

  • 微信语音如何导出(amr文件怎么播放)

    微信是我们常用的社交软件,聊天时候免不了不想打字而去发送语音,或者现在很多网课都是通过微信发给小伙伴们,都知道微信里面的语音是无法转发的,而且微信的android版的语音文件采用a…

  • 语言(掷怎么读)

    编号 建议用字 音读 又音 普通话用字 用例 异用字 001 阿 a 阿 阿母、阿爸 002 阿妗 a-kīm 舅妈 阮阿舅佮阿妗咧 做生理 003 阿姆 a-ḿ 伯母 阮阿伯佮阿…

  • 想偷看我的文件(苹果手机怎么给软件加密)

    随着手机的功能越来越强大,现在不少人都开始喜欢用手机办公了,不过工作中总有一些重要的工作文件,如果泄露了那就完蛋了,明天直接卷铺盖走人!不过苹果手机里却有一个很好用的功能,可以有效…

  • 七种方式(怎么表白女生)

    喜欢女生就要大胆说出来,就要鼓足勇气向女生表白,但是向喜欢的女生表白光有勇气是远远不够的。 怎么跟喜欢的女生表白呢? 一、直接表白 就是直接向女生面对面表白的方式。 喜欢是你自己的…

  • 小鹏汽车vs特斯拉(xp3文件怎么打开)

    比无人驾驶来得更早的,是无人驾驶领域的知识产权纠纷。 4月27日,小鹏汽车旗下第二款量产车型小鹏P7正式上市,新车定位为中型纯电动轿跑,对标的竟手是海外新能源汽车巨头特斯拉。 据官…

  • U(azw3文件怎么打开)

    对于经常尝鲜使用 Windows 软件的玩家来说,安装/卸载 EXE 程序已经是司空见惯的使用过程。 如果你厌倦长时间等待安装的过程,那么实用的绿色工具正好帮助解决上面的使用痛点。…

  • 国内语言类大学排名已公布(北京语言大学排名)

    语言类的大学主要就是指那些以语言为主要教学学科的高等院校,为了可以适应教育的改革与发展,现在目前国内很少有单独从事这些语言类的大学,现在都在慢慢地走向综合性的大学里靠拢,但是语言类…

分享本页
返回顶部