go常用内置包文件读写

42 阅读4分钟

 读文件

func Exit(code int)

  • 让当前程序以给出的状态码code退出。一般来说,状态码0表示成功,非0表示出错。

func Open(name string) (file *File, err error)

  • Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。

  • 例子。在GOPATH下的src里,建立一个test.txt

    里边写下

    hello

    world

    编写go代码。

​编辑

buffio

func NewReader

NewReader创建一个具有默认大小缓冲、从r读取的*Reader。

func NewReader(rd io.Reader) *Reader

例子:按行读取

    file, err := os.Open("./test.txt")
    if err != nil {
        os.Exit(1)
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    for {
        line, err := reader.ReadString('\n')
        if err == io.EOF {
            //不加这一句,最后一样如果不换行,会导致最后一行不输出
            //如果最后一行换行,最后的line为空字符串,对于输出并不影响
            fmt.Printf("%q,%t", line, (line == ""))
            break
        }
        fmt.Print(line)
    }

3.一次读取全部

os.ReadFile

    b, err := os.ReadFile("./test.txt")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(b))

io.ReadAll

该函数接收一个实现了io.Reader接口的参数r,并将从r中读取的所有数据返回为字节切片。返回的字节切片即为文件的完整内容,读取操作完成后,ReadAll函数会自动关闭r。

file, err := os.Open("./test_u8.txt")
    if err != nil {
        os.Exit(1)
    }
    defer file.Close()
    content, err := io.ReadAll(file)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(content))

写文件

1.OS模块

func OpenFile(name string, flag int, perm FileMode) (*File, error)

  • flag:打开文件的模式

O_RDONLY:只读打开文件,用的较少,因为Open方法用的就是它。

O_WRONLY:只写

O_RDWR:读写

注意上面这三个,是互斥的,不可以同时使用。

O_APPEND:追加写入

O_CREATE:文件不存在则创建,存在就不管。

O_EXCL:文件存在则报错。配合O_CREATE使用,如果创建的文件已存在就报错。

O_SYNC:同步IO,等待上一次IO完成。

O_TRUNC:对于可写的文件,打开时清空内容。

  • perm:文件权限

参考liunx文件权限。

0666。代表所有人都有可读写的权限。前边的0代表这个数字是使用8进制

0644。代表自己可读写,其他人只能读

例子。

编写go代码。

2.buffio

如果需要多次执行写入文件的操作,推荐使用 bufio 里的 Writer 结构体去操作,它会开辟一个缓冲区,默认大小为 4096 字节。在数据没有被刷入磁盘之前,所写入的数据都会暂时保存到缓冲区里。

NewWriter(w io.Writer) *Writer 开辟一个默认值为 4096 字节的缓冲区,用于暂存写入文件的数据内容,返回一个 Writer 结构体的指针变量

w 参数:类型为 Writer 接口,实现这个接口的数据类型变量都可以作为参数,例如 File。 返回值 *Writer:一个 Writer 结构体的指针变量,通过该变量可以往缓冲区里写入数据。

Writer.WriteString(s string) (int, error) 往缓冲区写入内容的方法。

参数 s 为写入的字符串。 第一个返回值为写入的字节数。 第二个返回值为写入数据的过程中产生的错误。

Writer.Flush() error 将所有的缓存数据写入磁盘。

返回值为数据写入磁盘的过程中产生的错误。

func main() {
    file, err := os.OpenFile("./test.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        os.Exit(1)
    }
    defer file.Close()
    buffWriter := bufio.NewWriter(file)
    buffWriter.WriteString("你好世界!\n")
    buffWriter.WriteString("你好,去!\n")
    buffWriter.Flush()
}

3.一次写入所有内容

os.WriteFile

此函数为覆盖写入。如果文本存在,并且有内容,会情况文件。如果文件不存在,会创建该文件

例子

os.WriteFile("./test.txt", []byte("我可以一次性写入"), 0666)

io.WriteString

w Writer 对象。

s 要写入的文件内容。

返回值

n 写入的字节数。

err 如果操作成功,返回 nil **否则,返回错误信息。

例子:

file, err := os.OpenFile("./test.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)

if err != nil {

os.Exit(1)

}

defer file.Close()

io.WriteString(file, "Hello, world!\n")

4.以读写模式打开,在指定位置读写

    f, err := os.OpenFile(./test.txt, os.O_RDWR, 0666) // 读写打开文件
    if err != nil {
        os.Exit(1)
    }
    defer f.Close()

    end, err := f.Seek(0, io.SeekEnd)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("end: ", end) // 移动到文件末尾。查看下偏移量
    fs, err := f.Stat()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("size: ", fs.Size()) // 根据文件状态属性查看文件大小

    start, err := f.Seek(24, io.SeekStart) //从文件开头偏移24个位置
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("start: ", start)
    _, err = f.WriteString("a") //覆盖写。把第25个位置的字符换成a
    if err != nil {
        log.Fatal(err)
    }
    var b = []byte{0}
    f.Read(b)                     // 读取后边一个字节
    fmt.Println("b: ", string(b)) // 输出b