關於幾種讀取檔案方法的詳細區別
一般來說常用的有四種
- 使用File內建的Read方法
- 使用bufio庫的Read方法
- 使用io/ioutil庫的ReadAll()
- 使用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...
先參考這篇部落格,有時間深入研究