Golang 檔案操作的深入研究

來源:互聯網
上載者:User

關於幾種讀取檔案方法的詳細區別

一般來說常用的有四種

  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()

反正不建議用普通的Read

總之要效能就bufio,方便就ioutil

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

以下列出各種方法的樣本

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 mainimport (    "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 mainimport (    "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...

先參考這篇部落格,有時間深入研究

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.