Go操作文件的几种方式|Go主题月

401 阅读2分钟

Go操作文件的方式有很多,这里只是整理一下做一个记录。所有代码可以直接拿来使用,代码很简单,就不做更多解释了。

读取文件

通过os.Open读取文件

如下代码:

func TestReadFile(t *testing.T) {
    fileName := "/tmp/mockdata.txt"
    file, err := os.Open(fileName)
    defer closeResource(file)
    if err != nil {
        log.Fatalf("failed to open file %s", fileName)
    }

    var tempSlice = make([]byte, 128)
    var strSlice []byte
    for {
        n, err := file.Read(tempSlice)
        if err == io.EOF {
            log.Printf("%s is read compeletely.", fileName)
            break
        }
        if err != nil {
            log.Fatalf("failed to read file.")
        }
        log.Printf("read %d bytes\n", n)
        strSlice = append(strSlice, tempSlice[:n]...)
    }
    log.Println(string(strSlice))
}

func closeResource(closeable io.Closer) {
    if closeable != nil {
        if err := closeable.Close(); err != nil {
            log.Errorln("failed to close resource.", err)
        }
    }
}

通过bufio读取文件

如下代码:

func TestReadFile(t *testing.T) {
    fileName := "/tmp/mockdata.txt"
    file, err := os.Open(fileName)
    defer closeResource(file)
    if err != nil {
        log.Fatalf("failed to open file %s", fileName)
    }

    var tempSlice = make([]byte, 128)
    var strSlice []byte
    for {
        n, err := file.Read(tempSlice)
        if err == io.EOF {
            log.Printf("%s is read compeletely.", fileName)
            break
        }
        if err != nil {
            log.Fatalf("failed to read file.")
        }
        log.Printf("read %d bytes\n", n)
        strSlice = append(strSlice, tempSlice[:n]...)
    }
    log.Println(string(strSlice))
}

func closeResource(closeable io.Closer) {
    if closeable != nil {
        if err := closeable.Close(); err != nil {
            log.Errorln("failed to close resource.", err)
        }
    }
}

通过ioutil读取文件

如下代码:

func TestReadFileByIOUtil(t *testing.T) {
    fileName := "/tmp/mockdata.txt"
    bytes, err := ioutil.ReadFile(fileName)
    if err != nil {
        log.Fatalf("failed to open file %s", fileName)
    }
    t.Log(string(bytes))
}

写文件

通过file.Write写入文件

如下代码:

func TestWriteFile(t *testing.T) {
    fileName := "test.txt"
    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666)
    if err != nil {
        t.Fatal(err)
    }
    defer closeResource(file)
    _, err = file.WriteString("wtf")
    if err != nil {
        t.Fatal(err)
    }
}

func closeResource(closeable io.Closer) {
    if closeable != nil {
        if err := closeable.Close(); err != nil {
            log.Errorln("failed to close resource.", err)
        }
    }
}

通过bufio写入文件

如下代码:

func TestWriteFileViaBufferIO(t *testing.T) {
    fileName := "test1.txt"
    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666)
    if err != nil {
        t.Fatal(err)
    }
    defer closeResource(file)

    writer := bufio.NewWriter(file)
    defer closeResource(writer)
    _, err = writer.WriteString("just a test")
    if err != nil {
        t.Fatal(err)
    }
    err = writer.Flush()
    if err != nil {
        t.Fatal(err)
    }
}

func closeResource(closeable io.Closer) {
    if closeable != nil {
        if err := closeable.Close(); err != nil {
            log.Errorln("failed to close resource.", err)
        }
    }
}

通过ioutil写入文件

如下代码:

func TestWriteFileViaIOUtil(t *testing.T) {
    fileName := "test2.txt"
    err := ioutil.WriteFile(fileName, []byte("just a test file."), 0666)
    if err != nil {
        t.Fatal(err)
    }
}

后记

通过以上的例子,可以发现ioutil包提供了很多有用的方法。如果需要操作文件,优先看看ioutil包里有没有提供对应的方法。