> 백엔드 개발 > Golang > Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석

Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석

青灯夜游
풀어 주다: 2023-04-20 18:28:45
앞으로
3743명이 탐색했습니다.

Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석

이 글에서는 Golang에서 파일을 읽는 방법에 대해 설명합니다. 이러한 파일을 처리하기 위해 다음 패키지를 사용합니다.

  • os 패키지는 운영 수준 작업을 수행하기 위한 플랫폼 독립적인 인터페이스를 제공합니다.
  • IOutil 패키지는 내부 구현에 대해 너무 많이 알지 않고도 파일 작업을 할 수 있는 사용하기 쉬운 유틸리티 기능을 제공합니다.
  • bufio 패키지는 버퍼링된 IO를 구현하여 입력 및 출력 작업의 성능과 처리량을 향상시키는 데 도움이 됩니다.
  • log 패키지는 간단한 로깅 패키지를 구현합니다. 우리는 이것을 프로그램 전반에 걸쳐 사용할 것입니다. 우리 프로그램에서는 로깅 패키지의 Fatal() 함수를 사용하겠습니다. Fatal() 函数。

整个文件读取

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

전체 파일 읽기

전체 파일을 한 번에 쉽게 읽고 변수에 저장할 수 있습니다. 하지만 대용량 파일에는 이 작업을 수행하면 안 된다는 점을 기억하세요. ioutil.ReadFile() 함수를 사용하여 파일을 읽고 파일 내용을 변수에 저장합니다. 🎜🎜먼저 프로그램과 동일한 디렉터리에 파일을 저장해 보겠습니다. 따라서 폴더 구조는 다음과 같습니다. 🎜
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))
	}
}
로그인 후 복사
로그인 후 복사
🎜 main.go 함수에 다음을 작성합니다. 🎜rrreee🎜하지만 먼저 ReadFile() 함수의 경우를 살펴보겠습니다. 🎜🎜🎜 정의: 메소드 선언 func ReadFile(filename string) ([]byte, error)🎜🎜Function: 함수 매개변수에 경로가 전달된 파일을 읽고 파일의 내용을 반환합니다. 내부적으로 사용되는 os.ReadFile(fileName) 메서드 🎜🎜Returns: 파일의 내용과 오류를 바이트 배열로 반환합니다. 성공적인 호출은 err == nil🎜을 반환합니다.🎜내부 ReadFile 함수는 다음과 같이 구현됩니다:🎜rrreee🎜이제 프로그램으로 돌아가겠습니다:🎜🎜🎜ioutil.ReadFile("readthisfile.txt " ) byteArray 및 오류를 반환합니다. byteArray를 "content" 변수에 저장하고 오류는 "err" 변수에 저장합니다. 🎜🎜그런 다음 if 조건을 넣고 err 값이 nil이 아니면 log.Fatal() 함수를 사용하여 err 오류를 인쇄합니다. Fatal() 함수는 os.Exit(1) 을 호출하는 Print() 함수와 동일하다는 점을 기억하세요. 🎜🎜마지막으로 fmt.Println() 함수를 사용하여 파일 내용을 인쇄해 보겠습니다. content 변수는 바이트 배열이고 이를 문자열로 변환해야 하기 때문에 단순히 인쇄할 수 없습니다: string(content)🎜🎜그런 다음 새 ilovego.txt 파일을 만들고 다음 내용을 작성합니다. 🎜rrreee🎜마지막으로 위 코드를 실행하면 다음 출력을 볼 수 있습니다. 🎜rrreee

한 줄씩 읽기< /strong>

🎜Scanner Scanner는 개행으로 구분된 텍스트 줄로 구성된 파일과 같은 데이터를 읽을 수 있는 편리한 인터페이스를 제공합니다. 마커를 통해 데이터를 읽습니다. Split 함수는 마커를 정의합니다. 기본적으로 이 함수는 데이터를 행으로 나누고 행 끝을 제거합니다. 🎜rrreee🎜🎜os.Open() 매개변수에 전달된 파일을 엽니다. 파일을 여는 동안 오류가 발생하면 동일한 오류가 반환됩니다. 그렇지 않으면 오류는 0이 됩니다. 🎜🎜그런 다음 스캐너를 사용하여 파일을 읽고 파일 내용이 끝날 때까지 한 줄씩 스캔합니다. 🎜🎜마지막으로 파일을 닫고 싶습니다. 🎜🎜프로그램을 실행하면 다음과 같은 결과가 나옵니다: 🎜🎜Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석🎜

단어 단위로 읽기

🎜파일을 단어 단위로 읽을 수도 있습니다: 🎜rrreee🎜코드를 실행하세요: 🎜rrreee

데이터 블록 형식으로 파일 읽기

🎜전체 파일을 한 번에 읽는 것이 쉬운 방법인 것처럼 보이지만 때로는 프로그램을 최적화해야 할 때도 있습니다. Golang은 파일 전체를 읽거나 한 줄씩 읽는 대신 파일을 덩어리로 읽는 방법을 제공합니다. 행의 크기가 너무 크면 행 단위로 읽는 것도 비효율적일 수 있기 때문입니다. 🎜rrreee

바이너리 읽기

🎜hex 패키지는 16진수 인코딩 및 디코딩을 구현합니다. 🎜
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 函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。希望能对你有所帮助!

推荐学习:Golang教程

위 내용은 Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿