參考
讀文件
讀取的文件放在file/test:也就是file包下的test這個(gè)文件,里面寫多一點(diǎn)文件
- 讀文件方式一:利用ioutil.ReadFile直接從文件讀取到[]byte中
func Read0() (string){
f, err := ioutil.ReadFile("file/test")
if err != nil {
fmt.Println("read fail", err)
}
return string(f)
}
- 讀文件方式二:先從文件讀取到file中,在從file讀取到buf, buf在追加到最終的[]byte
func Read1() (string){
//獲得一個(gè)file
f, err := os.Open("file/test")
if err != nil {
fmt.Println("read fail")
return ""
}
//把file讀取到緩沖區(qū)中
defer f.Close()
var chunk []byte
buf := make([]byte, 1024)
for {
//從file讀取到buf中
n, err := f.Read(buf)
if err != nil && err != io.EOF{
fmt.Println("read buf fail", err)
return ""
}
//說明讀取結(jié)束
if n == 0 {
break
}
//讀取到最終的緩沖區(qū)中
chunk = append(chunk, buf[:n]...)
}
return string(chunk)
//fmt.Println(string(chunk))
}
- 讀文件方式三:先從文件讀取到file, 在從file讀取到Reader中,從Reader讀取到buf, buf最終追加到[]byte
//先從文件讀取到file, 在從file讀取到Reader中,從Reader讀取到buf, buf最終追加到[]byte庵楷,這個(gè)排第三
func Read2() (string) {
fi, err := os.Open("file/test")
if err != nil {
panic(err)
}
defer fi.Close()
r := bufio.NewReader(fi)
var chunks []byte
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))
chunks = append(chunks, buf...)
}
return string(chunks)
//fmt.Println(string(chunks))
}
- 讀文件方式四:讀取到file中,再利用ioutil將file直接讀取到[]byte中
//讀取到file中,再利用ioutil將file直接讀取到[]byte中, 這是最優(yōu)
func Read3() (string){
f, err := os.Open("file/test")
if err != nil {
fmt.Println("read file fail", err)
return ""
}
defer f.Close()
fd, err := ioutil.ReadAll(f)
if err != nil {
fmt.Println("read to fd fail", err)
return ""
}
return string(fd)
}
讀取速度比較
經(jīng)過我的測(cè)試赫编,這四種方式讀的速度排名是:前者為優(yōu)
方式四 > 方式一 > 方式三 > 方式四
寫文件
- 寫文件方式一:使用 io.WriteString 寫入文件
func Write0() {
fileName := "file/test1"
strTest := "測(cè)試測(cè)試"
var f *os.File
var err error
if CheckFileExist(fileName) { //文件存在
f, err = os.OpenFile(fileName, os.O_APPEND, 0666) //打開文件
if err != nil{
fmt.Println("file open fail", err)
return
}
}else { //文件不存在
f, err = os.Create(fileName) //創(chuàng)建文件
if err != nil {
fmt.Println("file create fail")
return
}
}
//將文件寫進(jìn)去
n, err1 := io.WriteString(f, strTest)
if err1 != nil {
fmt.Println("write error", err1)
return
}
fmt.Println("寫入的字節(jié)數(shù)是:", n)
}
- 寫文件方式二:使用 ioutil.WriteFile 寫入文件
func Write1() {
fileName := "file/test2"
strTest := "測(cè)試測(cè)試"
var d = []byte(strTest)
err := ioutil.WriteFile(fileName, d, 0666)
if err != nil {
fmt.Println("write fail")
}
fmt.Println("write success")
}
- 寫文件方式三:使用 File(Write,WriteString) 寫入文件
func Write2() {
fileName := "file/test3"
strTest := "測(cè)試測(cè)試"
var d1 = []byte(strTest)
f, err3 := os.Create(fileName) //創(chuàng)建文件
if err3 != nil{
fmt.Println("create file fail")
}
defer f.Close()
n2, err3 := f.Write(d1) //寫入文件(字節(jié)數(shù)組)
fmt.Printf("寫入 %d 個(gè)字節(jié)n", n2)
n3, err3 := f.WriteString("writesn") //寫入文件(字節(jié)數(shù)組)
fmt.Printf("寫入 %d 個(gè)字節(jié)n", n3)
f.Sync()
}
- 寫文件方式四:使用 bufio.NewWriter 寫入文件
func Write3() {
fileName := "file/test3"
f, err3 := os.Create(fileName) //創(chuàng)建文件
if err3 != nil{
fmt.Println("create file fail")
}
w := bufio.NewWriter(f) //創(chuàng)建新的 Writer 對(duì)象
n4, err3 := w.WriteString("bufferedn")
fmt.Printf("寫入 %d 個(gè)字節(jié)n", n4)
w.Flush()
f.Close()
}
- 檢查文件是否存在:
func CheckFileExist(fileName string) bool {
_, err := os.Stat(fileName)
if os.IsNotExist(err) {
return false
}
return true
}
注意事項(xiàng)
- 本文參考較大,如有侵權(quán)奋隶,請(qǐng)私信我處理擂送,謝謝
- 寫文件的幾種方式?jīng)]有經(jīng)過比較,如果有比較的話唯欣,也可以評(píng)論此篇文章告知我結(jié)果嘹吨,謝謝
作者:右眼皮的愛
鏈接:http://www.reibang.com/p/93772ececf65
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處境氢。