写在前面

在前面的文章当中,我们学会了如何去搭建Golang开发环境、学习了Golang当中常见的数据结构、学习了基本流程控制语句、学习了函数和结构体等内容,接下来我们将开始学习Golang当中的文件读写。

读取用户在控制台的输入

fmtScan

请看下面的例子:

package main

import "fmt"

func main() {
    var firstname,lastname string
    fmt.Println("请输入您的姓名:")
    _, _ = fmt.Scanln(&firstname, &lastname)
    fmt.Printf("你好!%s · %s\n", lastname, firstname)

}

输出:

请输入您的姓名:
韩 立
你好!立 · 韩
ScanlnScanfScanfSscanSscanScanf
bufio

请看下面的例子:

package main

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

func main() {

    fmt.Println("请输入一段文字")
    inputReader := bufio.NewReader(os.Stdin)
    s,err := inputReader.ReadString('\n')
    if err == nil {
        fmt.Println("你输入的是:")
        fmt.Println(s)
    }

}

输出:

请输入一段文字
去年今日此门中 人面桃花相映红。人面不知何处在 桃花依旧笑春风。
你输入的是:
去年今日此门中 人面桃花相映红。人面不知何处在 桃花依旧笑春风。

文件读写

文件读操作

os.File

按行读取

请看下面的例子:

package main

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

func main() {
    inputFile, err := os.Open("G:\\06_golangProject\\golang\\doc\\筑基部分\\10_golang中的读写数据.md")
    defer inputFile.Close()
    if err!=nil {
        fmt.Println(err)
    }

    input :=bufio.NewReader(inputFile)
    for{
        readString, err := input.ReadString('\n')
        fmt.Println(readString)
        if err==io.EOF {
            fmt.Println(err)
            return
        }
    }


}
os.Open

带缓冲的文件读取

很不幸的是,在很多情况下,文件的内容不是按行划分的,甚至有时候文件是一个二进制文件。这时,我们应当如何去读取它呢?

请看下面的这个例子:

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {

    buf := make([]byte,1024)

    inputFile, err := os.Open("G:\\06_golangProject\\golang\\doc\\筑基部分\\10_golang中的读写数据.md")
    defer inputFile.Close()
    if err!=nil {
        fmt.Println(err)
    }
    for  {
        _, err := inputFile.Read(buf)

        if err==io.EOF {
            return
        }
        fmt.Println(string(buf))
    }


}
[]byte

文件写操作

简单地介绍了Golang中的文件读操作,再讲一下文件的写操作,请看下面的例子:

package main

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

func main() {

    file, err := os.OpenFile("古丹丹方.txt", os.O_WRONLY|os.O_CREATE, 0666)


    if err != nil  {
        fmt.Println("打开文件出错")
        return
    }
    defer  file.Close()

    // 创建一个缓冲区
    writer := bufio.NewWriter(file)

    s := "Hello World\n"

    for i := 0; i < 10; i++ {
        // 写入缓冲区
        _, _ = writer.WriteString(s)
    }
    // 将缓冲区的数据写入文件
    _ = writer.Flush()
}
os.OpenFile(name string, flag int, perm FileMode) (*File, error)
|
os.O_RDONLYos.O_WRONLYos.O_CREATEos.O_TRUNC
OpenFile

文件拷贝

不知还有道友记得没,韩立在筑基期的洞府里用两株草药换了他雷师伯的丹方,他雷师伯当然不会直接将古方给他,而是将丹方拷贝了一份到玉简给了韩立。

source.txttarget.txt
package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
copyFile("古丹丹方.txt","给韩立的玉简.txt")
fmt.Println("拷贝完成!")

}

func copyFile(source, target string)  {

    openFile, err := os.Open(source)
    if err!=nil {
        fmt.Println("打开源文件出错")
        return
    }
    defer openFile.Close()

    createFile, err := os.Create(target)
    if err!=nil {
        fmt.Println("创建目标文件出错")
        return
    }
    defer createFile.Close()

    written, err := io.Copy(createFile, openFile)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(written)

}
io.Copy

写在最后

以上就是Golang关于文件读写的上半部分内容,本文当中涉及到的例子可以点击此处下载。如果我的学习笔记能够给你带来帮助,还请多多点赞鼓励。文章如有错漏之处还请各位小伙伴帮忙斧正。

在下一篇文章当中我们将一起来学习Golang读取命令行参数和Golang中的数据网络传输等内容。