Golang 文件操做的深刻研究

關於幾種讀取文件方法的詳細區別

通常來講經常使用的有四種segmentfault

  1. 使用File自帶的Read方法
  2. 使用bufio庫的Read方法
  3. 使用io/ioutil庫的ReadAll()
  4. 使用io/ioutil庫的ReadFile()

先說結論緩存

當每次讀取塊的大小小於4KB,建議使用bufio.NewReader(f), 大於4KB用bufio.NewReaderSize(f,緩存大小)函數

要讀Reader, 圖方便用ioutil.ReadAll()性能

一次性讀取文件,使用ioutil.ReadFile()ui

反正不建議用普通的Read.net

總之要性能就bufio,方便就ioutilcode

https://segmentfault.com/a/11... 這篇文章有深刻研究對象

如下列出各類方法的示例blog

OS包

func read1(path string){  
    fi,err := os.Open(path)  
    if err != nil{  
        panic(err)  
    }  
    defer fi.Close()  
  
    buf := make([]byte,1024)  
    for{  
        n,err := fi.Read(buf)  
        if err != nil && err != io.EOF{panic(err)}  
        if 0 ==n {break}  
        fmt.Println(string(buf[:n]))  
    }  
}

bufio包

func read2(path string){  
    fi,err := os.Open(path)  
    if err != nil{panic(err)}  
    defer fi.Close()  
    r := bufio.NewReader(fi)  
    
    buf := make([]byte,1024)  
    for{  
        n,err := r.Read(buf)  
        if err != nil && err != io.EOF{panic(err)}  
        if 0 ==n {break}  

        fmt.Println(string(buf[:n]))  
    }  
}

ioutil包

func read4(path string){
    r,err := ioutil.ReadFile(path)
    if err != nil{panic(err)}
    fmt.Println(r)
}

或者排序

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

os包詳細用法

目錄處理

  • func Mkdir(name string, perm FileMode) error

建立名稱爲name的目錄,權限設置是perm,例如0777

  • func MkdirAll(path string, perm FileMode) error

根據path建立多級子目錄,例如astaxie_test1_test2。

  • func Remove(name string) error

刪除名稱爲name的目錄,當目錄下有文件或者其餘目錄時會出錯

  • func RemoveAll(path string) error

根據path刪除多級子目錄,若是path是單個名稱,那麼該目錄下的子目錄所有刪除。

package main

import (
    "fmt"
    "os"
)

func main() {
    os.Mkdir("astaxie", 0777)
    os.MkdirAll("astaxie/test1/test2", 0777)
    err := os.Remove("astaxie")
    if err != nil {
        fmt.Println(err)
    }
    os.RemoveAll("astaxie")
}

文件建立

新建文件能夠經過以下兩個方法

  • func Create(name string) (file *File, err Error)

根據提供的文件名建立新的文件,返回一個文件對象,默認權限是0666的文件,返回的文件對象是可讀寫的。

  • func NewFile(fd uintptr, name string) *File

根據文件描述符建立相應的文件,返回一個文件對象

經過以下兩個方法來打開文件:

  • func Open(name string) (file *File, err Error)

該方法打開一個名稱爲name的文件,可是是隻讀方式,內部實現其實調用了OpenFile。

  • func OpenFile(name string, flag int, perm uint32) (file *File, err Error)

打開名稱爲name的文件,flag是打開的方式,只讀、讀寫等,perm是權限

寫文件

  • func (file *File) Write(b []byte) (n int, err Error)

寫入byte類型的信息到文件

  • func (file *File) WriteAt(b []byte, off int64) (n int, err Error)

在指定位置開始寫入byte類型的信息

  • func (file *File) WriteString(s string) (ret int, err Error)

寫入string信息到文件

讀文件

  • func (file *File) Read(b []byte) (n int, err Error)

讀取數據到b中

  • func (file *File) ReadAt(b []byte, off int64) (n int, err Error)

從off開始讀取數據到b中

package main

import (
    "fmt"
    "os"
)

func main() {
    userFile := "asatxie.txt"
    fl, err := os.Open(userFile)        
    if err != nil {
        fmt.Println(userFile, err)
        return
    }
    defer fl.Close()
    buf := make([]byte, 1024)
    for {
        n, _ := fl.Read(buf)
        if 0 == n {
            break
        }
        os.Stdout.Write(buf[:n])
    }
}

刪除文件

  • func Remove(name string) Error

調用該函數就能夠刪除文件名爲name的文件

ioutil包詳細用法

包名 」io/ioutil「

func ReadAll(r io.Reader) ([]byte, error)

讀取 r 中全部數據並返回

func main() {
    s := strings.NewReader("Hello World!")
    ra, _ := ioutil.ReadAll(s)
    fmt.Printf("%s", ra)
}

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

直接讀取文件

func main() {
    ra, _ := ioutil.ReadFile("file path")
    fmt.Printf("%s", ra)
}

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

WriteFile 向文件 filename 中寫入數據 data

若是文件不存在,則以 perm 權限建立該文件

若是文件存在,os.FileMode 不一樣使用不一樣的規則

func main() {
    fn := "file path""
    s := []byte("Hello World!")
    ioutil.WriteFile(fn, s, os.ModeAppend)
    rf, _ := ioutil.ReadFile(fn)
    fmt.Printf("%s", rf)
}

func ReadDir(dirname string) ([]os.FileInfo, error)

ReadDir 讀取目錄 dirmane 中的全部目錄和文件(不包括子目錄)

返回讀取到的文件的信息列表和讀取過程當中遇到的任何錯誤

返回的文件列表是通過排序的

func main() {
    rd, err := ioutil.ReadDir("file path")
    for _, fi := range rd {
        fmt.Println("")
        fmt.Println(fi.Name())
        fmt.Println(fi.IsDir())
        fmt.Println(fi.Size())
        fmt.Println(fi.ModTime())
        fmt.Println(fi.Mode())
    }
    fmt.Println("")
    fmt.Println(err)
}

bufio包詳細用法

https://blog.csdn.net/chenbao...

先參考這篇博客,有時間深刻研究

相關文章
相關標籤/搜索