博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang学习笔记 ----读写文件
阅读量:6873 次
发布时间:2019-06-26

本文共 5106 字,大约阅读时间需要 17 分钟。

使用io/ioutil进行读写文件

ioutil包

其中提到了两个方法: 

func ReadFile

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

ReadFile reads the file named by filename and returns the contents. A successful call returns err == nil, not err == EOF. Because ReadFile reads the whole file, it does not treat an EOF from Read as an error to be reported.

func WriteFile

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

WriteFile writes data to a file named by filename. If the file does not exist, WriteFile creates it with permissions perm; otherwise WriteFile truncates it before writing

读文件:

package mainimport (    "fmt"    "io/ioutil")func main() {    b, err := ioutil.ReadFile("test.log")    if err != nil {        fmt.Print(err)    }    fmt.Println(b)    str := string(b)    fmt.Println(str)}

写文件:

package mainimport (    "io/ioutil")func check(e error) {    if e != nil {        panic(e)    }}func main() {    d1 := []byte("hello\ngo\n")    err := ioutil.WriteFile("test.txt", d1, 0644)    check(err)}

  

使用os进行读写文件

os包

首先要注意的就是两个打开文件的方法: 

func Open

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

Open opens the named file for reading. If successful, methods on the returned file can be used for reading; the associated file descriptor has mode O_RDONLY. If there is an error, it will be of type *PathError.

 读文件:

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)

OpenFile is the generalized open call; most users will use Open or Create instead. It opens the named file with specified flag (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, methods on the returned File can be used for I/O. If there is an error, it will be of type *PathError.

  读文件:

package mainimport (    "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 mainimport (    "bufio"    "fmt"    "io"    "os")func check(e error) {    if e != nil {        panic(e)    }}func main() {    f, err := os.Open("foo.dat")    check(err)    b1 := make([]byte, 5)    n1, err := f.Read(b1)    check(err)    fmt.Printf("%d bytes: %s\n", 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: %s\n", 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: %s\n", 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: %s\n", string(b4))    f.Close()}

  写方法

package mainimport (    "bufio"    "fmt"    "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 bytes\n", n2)    n3, err := f.WriteString("writes\n")    fmt.Printf("wrote %d bytes\n", n3)    f.Sync()    w := bufio.NewWriter(f)    n4, err := w.WriteString("buffered\n")    fmt.Printf("wrote %d bytes\n", 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("%s\n", 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 := "foo.dat"
 
    start := time.Now()
 
    read0(file)
    t0 := time.Now()
    fmt.Printf("Cost time %v\n", t0.Sub(start))
 
    read1(file)
    t1 := time.Now()
    fmt.Printf("Cost time %v\n", t1.Sub(t0))
 
    read2(file)
    t2 := time.Now()
    fmt.Printf("Cost time %v\n", t2.Sub(t1))
 
    read3(file)
    t3 := time.Now()
    fmt.Printf("Cost time %v\n", t3.Sub(t2))
 
}

  

转载地址:http://lupfl.baihongyu.com/

你可能感兴趣的文章
白钰铭的第六次作业
查看>>
linkin大话数据结构--List
查看>>
idea中查看java类继承图
查看>>
JDBC 自定义连接池
查看>>
iscroll在iphone浏览器上闪动的BUG
查看>>
sql替换数据库字段中的字符
查看>>
python 生成器函数
查看>>
svg简介
查看>>
关于jvm中的常量池和String.intern()理解
查看>>
python - yaml模块
查看>>
基于Adobe Flash平台的3D页游技术剖析
查看>>
学期总结ngu
查看>>
Linux -- Centos6 yum安装相关问题与处理
查看>>
nginx配置文件结构,语法,配置命令解释
查看>>
使用 awstats 分析 Nginx 的访问日志(IBM)
查看>>
解决ef第一次启动较慢
查看>>
适合0基础的web开发系列教程-HTML5 Web Workers
查看>>
新博客,新开始
查看>>
php,二维数组的输出出现了问题,提示:Notice: Array to string conversion
查看>>
学java的目的是大数据和人工智能,勿忘初心!
查看>>