开放的编程资料库

当前位置:我爱分享网 > Go教程 > 正文

Golang中读取文件

Goreadfile教程展示了如何在Golang中读取文件。我们读取文本和二进制文件。在Go写入文件中了解如何在Go中写入文件。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

要在Go中读取文件,我们使用osioutiliobufio包。

The Battle of Thermopylae was fought between an alliance of Greek city-states,
led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over the
course of three days, during the second Persian invasion of Greece.

我们在一些例子中使用这个文本文件。

将文件读入字符串

ioutil.ReafFile函数将整个文件读入一个字符串。这个函数很方便,但不应该用于非常大的文件。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
)

func main() {

    content, err := ioutil.ReadFile("thermopylae.txt")

     if err != nil {
          log.Fatal(err)
     }

    fmt.Println(string(content))
}

该示例读取整个文件并将其打印到控制台。

$ go run read_file.go
The Battle of Thermopylae was fought between an alliance of Greek city-states,
led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over the
course of three days, during the second Persian invasion of Greece.

逐行读取文件

Scanner提供了一个方便的接口来读取数据,例如以换行符分隔的文本行文件。它通过令牌读取数据;Split函数定义令牌。默认情况下,该函数将数据分成行,并去除行终止符。

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {

    f, err := os.Open("thermopylae.txt")

    if err != nil {
        log.Fatal(err)
    }

    defer f.Close()

    scanner := bufio.NewScanner(f)

    for scanner.Scan() {

        fmt.Println(scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

该示例逐行读取文件。打印每一行。

f, err := os.Open("thermopylae.txt")

Open函数打开文件进行读取。

defer f.Close()

文件描述符在main函数结束时关闭。

scanner := bufio.NewScanner(f)

创建了一个新的扫描仪。

for scanner.Scan() {

     fmt.Println(scanner.Text())
}

Scan将扫描器推进到下一个令牌,然后可通过BytesText函数获取。

逐字阅读文件

扫描仪的默认分割函数是ScanLines。使用SplitWords,我们按单词拆分内容。

package main

import (
    "fmt"
    "os"
    "bufio"
)

func main() {

    f, err := os.Open("thermopylae.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 read_by_word.go
The
Battle
of
Thermopylae
was
fought
between
...

分块读取文件

我们可以读取数据块中的文件。

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
    "io"
)

func main() {

    f, err := os.Open("thermopylae.txt")

    if err != nil {
         log.Fatal(err)
    }

    defer f.Close()

    reader := bufio.NewReader(f)
    buf := make([]byte, 16)

    for {
        n, err := reader.Read(buf)

        if err != nil {

           if err != io.EOF {

               log.Fatal(err)
           }

           break
        } 

        fmt.Print(string(buf[0:n]))
    }

    fmt.Println()
}

该示例按16字节的小部分读取文件。

buf := make([]byte, 16)

我们定义了一个16字节的数组。

for {
    n, err := reader.Read(buf)

    if err != nil {

         if err != io.EOF {

             log.Fatal(err)
         }

         break
    }

    fmt.Print(string(buf[0:n]))
}

在for循环中,我们使用Read将数据读入缓冲区,并使用Print将数组缓冲区打印到控制台。

去读取二进制文件

hex包实现了十六进制编码和解码。

package main

import (  
    "bufio"
    "encoding/hex"
    "fmt"
    "log"
    "os"
    "io"
)

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

在代码示例中,我们读取图像并以十六进制格式打印它。

fmt.Printf("%s", hex.Dump(buf))

Dump返回一个字符串,其中包含给定数据的十六进制转储。

$ go run read_binary_file.go
00000000  ff d8 ff e0 00 10 4a 46  49 46 00 01 01 00 00 01  |......JFIF......|
00000010  00 01 00 00 ff e1 00 2f  45 78 69 66 00 00 49 49  |......./Exif..II|
00000020  2a 00 08 00 00 00 01 00  0e 01 02 00 0d 00 00 00  |*...............|
00000030  1a 00 00 00 00 00 00 00  6b 69 6e 6f 70 6f 69 73  |........kinopois|
00000040  6b 2e 72 75 00 ff fe 00  3b 43 52 45 41 54 4f 52  |k.ru....;CREATOR|
00000050  3a 20 67 64 2d 6a 70 65  67 20 76 31 2e 30 20 28  |: gd-jpeg v1.0 (|
00000060  75 73 69 6e 67 20 49 4a  47 20 4a 50 45 47 20 76  |using IJG JPEG v|
00000070  38 30 29 2c 20 71 75 61  6c 69 74 79 20 3d 20 39  |80), quality = 9|
00000080  31 0a ff db 00 43 00 03  02 02 03 02 02 03 03 02  |1....C..........|
00000090  03 03 03 03 03 04 07 05  04 04 04 04 09 06 07 05  |................|
000000a0  07 0a 09 0b 0b 0a 09 0a  0a 0c 0d 11 0e 0c 0c 10  |................|
000000b0  0c 0a 0a 0e 14 0f 10 11  12 13 13 13 0b 0e 14 16  |................|
...  

在本教程中,我们介绍了在Go中读取文件。

列出所有Go教程。

未经允许不得转载:我爱分享网 » Golang中读取文件

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏