Go 文件读写操作 - Go语言中文社区

Go 文件读写操作


使用io/ioutil进行读写文件

ioutil提供了两个方法:

 

func ReadFile(filename string) ([]byte, error)

 

 

func WriteFile(filename string, data []byte, perm os.FileMode) error

 

读文件:

 

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {

	b, err := ioutil.ReadFile("e:/tt.txt")
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(b)
	str := string(b)
	fmt.Println(str)
}


写文件:

 

 

package main

import (
	"io/ioutil"
)

func check(e error) {
	if e != nil {
		panic(e)
	}
}

func main() {
	d1 := []byte("hellongon")
	err := ioutil.WriteFile("e:tt2.txt", d1, 0644)
	check(err)
}	panic(e)
	}
}

func main() {
	d1 := []byte("hellongon")
	err := ioutil.WriteFile("e:tt2.txt", d1, 0644)
	check(err)
}


使用OS进行读写文件

 

os包提供了两个方法:

func Open

 

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

 

 

 

 

读文件:

fi, err := os.Open(path)
    if err != nil {
        panic(err)
    }
    defer fi.Close()

func OpenFile 

 

需要提供文件路径、打开模式、文件权限

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

 

 

 

读文件:

package main

import (
    "log"
    "os"
)

func main() {
    f, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        log.Fatal(err)
    }
    if err := f.Close(); err != nil {
        log.Fatal(err)
    }
}

 

读方法:

 

 

package main

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

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {

    f, err := os.Open("/tmp/dat")
    check(err)

    b1 := make([]byte, 5)
    n1, err := f.Read(b1)
    check(err)
    fmt.Printf("%d bytes: %sn", n1, string(b1))

    o2, err := f.Seek(6, 0)
    check(err)
    b2 := make([]byte, 2)
    n2, err := f.Read(b2)
    check(err)
    fmt.Printf("%d bytes @ %d: %sn", n2, o2, string(b2))

    o3, err := f.Seek(6, 0)
    check(err)
    b3 := make([]byte, 2)
    n3, err := io.ReadAtLeast(f, b3, 2)
    check(err)
    fmt.Printf("%d bytes @ %d: %sn", n3, o3, string(b3))

    _, err = f.Seek(0, 0)
    check(err)

    r4 := bufio.NewReader(f)
    b4, err := r4.Peek(5)
    check(err)
    fmt.Printf("5 bytes: %sn", string(b4))

    f.Close()

}

 

写方法

package main

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

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {

    f, err := os.Create("/tmp/dat2")
    check(err)

    defer f.Close()

    d2 := []byte{115, 111, 109, 101, 10}
    n2, err := f.Write(d2)
    check(err)
    fmt.Printf("wrote %d bytesn", n2)

    n3, err := f.WriteString("writesn")
    fmt.Printf("wrote %d bytesn", n3)

    f.Sync()

    w := bufio.NewWriter(f)
    n4, err := w.WriteString("bufferedn")
    fmt.Printf("wrote %d bytesn", n4)

    w.Flush()

}

 

几种读取文件方法速度比较

package main

import (
    "bufio"
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "time"
)

func read0(path string) string {
    f, err := ioutil.ReadFile(path)
    if err != nil {
        fmt.Printf("%sn", err)
        panic(err)
    }
    return string(f)
}

func read1(path string) string {
    fi, err := os.Open(path)
    if err != nil {
        panic(err)
    }
    defer fi.Close()

    chunks := make([]byte, 1024, 1024)
    buf := make([]byte, 1024)
    for {
        n, err := fi.Read(buf)
        if err != nil && err != io.EOF {
            panic(err)
        }
        if 0 == n {
            break
        }
        chunks = append(chunks, buf[:n]...)
    }
    return string(chunks)
}

func read2(path string) string {
    fi, err := os.Open(path)
    if err != nil {
        panic(err)
    }
    defer fi.Close()
    r := bufio.NewReader(fi)

    chunks := make([]byte, 1024, 1024)

    buf := make([]byte, 1024)
    for {
        n, err := r.Read(buf)
        if err != nil && err != io.EOF {
            panic(err)
        }
        if 0 == n {
            break
        }
        chunks = append(chunks, buf[:n]...)
    }
    return string(chunks)
}

func read3(path string) string {
    fi, err := os.Open(path)
    if err != nil {
        panic(err)
    }
    defer fi.Close()
    fd, err := ioutil.ReadAll(fi)
    return string(fd)
}

func main() {

    file := "test.log" //file_name

    start := time.Now()

    read0(file)
    t0 := time.Now()
    fmt.Printf("Cost time %vn", t0.Sub(start))

    read1(file)
    t1 := time.Now()
    fmt.Printf("Cost time %vn", t1.Sub(t0))

    read2(file)
    t2 := time.Now()
    fmt.Printf("Cost time %vn", t2.Sub(t1))

    read3(file)
    t3 := time.Now()
    fmt.Printf("Cost time %vn", t3.Sub(t2))

}

本文参考:

https://www.yuque.com/docs/share/2990f968-2edb-4b16-93d5-3b62be7c4a66

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lengyuezuixue/article/details/78499022
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 12:44:57
  • 阅读 ( 945 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢