Golang 读写文件

Golang读写文件

       这里记录golang在读写操作文件时的一些方法,供后续查询使用;

       在读写文件时,此处记录3种方式来操作:

  1. 使用io/ioutils包来完成,主要为一次性读取和一次性写入
  2.  使用切片的方式,构建一个字节切片,将读入的内容放入其中,然后通过for循环写入
  3. 使用带缓冲的读取器bufio包操作,更便捷

一、读文件

文件打开模式

const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

文件打开与关闭

func Create(name string) (file *File, err error) // 创建一个空文件,注意当文件已经存在时,会直接覆盖掉原文件,不会报错

func Open(name string) (file *File, err error) // 打开一个文件,注意打开的文件只能读,不能写

func OpenFile(name string, flag int, perm FileMode) (file *File, err error) // 以指定的权限打开文件

func (f *File) Close() error // 关闭文件,关闭后不可读写

二、使用ioutil包

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    //要求:将一个文件的内容全部读出并写入到另一个文件中,这2个文件已存在
    file1Path := "d:/abc.txt"
    file2Path := "d:/kkk.txt"
    data, err := ioutil.ReadFile(file1Path)
    if err != nil {
        fmt.Printf("read file err=%v\n",err)
        return 
    }

    err = ioutil.WriteFile(file2Path,data,0666)
    if err != nil {
        fmt.Printf("write file error=%v",err)
    }
}

三、使用字节切片读取

package main

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

func main() {
    file, _ := os.Open("d:/tmp.txt")

    var output bytes.Buffer
    for {
        buf := make([]byte, 5)   //长度为5的切片,读取内容为5则不会显示后面的内容,需要使用循环判断
        n, err := file.Read(buf)
        if err != nil {
            if err == io.EOF {
                break
            } else {
                fmt.Printf("Error:could read data from the pipe,%s\n", err)
return } }
// fmt.Printf("length(buf):%v,string(buf):%v\n", n, string(buf)) if n > 0 { output.Write(buf[:n]) //循环写入 } } fmt.Printf("%s\n", output.String()) }

四、使用带缓冲的读取器

package main

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

func main() {
    file, _ := os.Open("d:/tmp.txt")

    outputbuf := bufio.NewReader(file)
    output0, _, err := outputbuf.ReadLine()
    if err != nil {
        fmt.Printf("Error:could read data from the pipe,%s\n", err)
        return
    }
    fmt.Printf("%s\n", string(output0))
}

 

posted @ 2022-07-29 23:48  wushaoyu  阅读(401)  评论(0编辑  收藏  举报