Go語言文件讀寫操作案例詳解
基本介紹
文件,對我們并不陌生,文件是數(shù)據(jù)源(保存數(shù)據(jù)的地方)的 一種
輸入流和輸出流 文件在程序中是以流的形式來操作的

流:數(shù)據(jù)在數(shù)據(jù)源(文件)和程序(內(nèi)存)之間經(jīng)歷的路徑 輸入流:數(shù)據(jù)從文件到內(nèi)存的路徑 輸出流:數(shù)據(jù)從內(nèi)存到文件的路徑
- os.File封裝所有文件相關(guān)操作,File是一個結(jié)構(gòu)體
文件基本操作
讀操作

package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"mahonia"
"os"
)
func main() {
//防止控制臺中文亂碼 如果是Golang編譯則需要安裝第三方轉(zhuǎn)碼包git clone https://github.com/axgle/mahonia.git
var enc mahonia.Decoder
enc = mahonia.NewDecoder("gbk")
//讀取文件的內(nèi)容并顯示在終端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
//打開文件 file,err:=os.Open(文件的絕對路徑)
file,err:=os.Open("F:/test.txt")
if err !=nil{
fmt.Println("open file err=",err)
}
//關(guān)閉文件
defer file.Close() //要及時關(guān)閉文件,否則會有內(nèi)存泄露
//創(chuàng)建一個"Reader",帶緩存 默認(rèn)緩存大小為4096 reader:=bufio.NewReader(file)
reader:=bufio.NewReader(file)
//讀取文件的內(nèi)容
for{
str,err:=reader.ReadString('\n')
fmt.Print(enc.ConvertString(str))
/*
你好啊
真的很好asdb
123
*/
if err ==io.EOF{// 文件末尾
break
}
}
//一次性讀取文件內(nèi)容,適用于文件較小的 無需開啟和關(guān)閉文件
// 使用 ioutil.ReadFile content為byte[]
content,err:=ioutil.ReadFile("f:/test.txt")
if err!=nil{
fmt.Println("read file err=",err)
}
fmt.Print(enc.ConvertString(string(content)))
/*
你好啊
真的很好asdb
123
*/
}
寫操作
文件打開函數(shù) func OpenFile(name string,flag int,perm FileMode)(file *File,err error)

package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"mahonia"
"os"
)
func main() {
//Read1()
//Read2("f:/test.txt",'gbk')
/*
你好啊
真的很好asdb
123
你好啊
真的很好asdb
123
*/
//創(chuàng)建一個新文件,寫入內(nèi)容 5句 "hello,Gardon"
//Write()
//打開一個存在的文件中,將原來的內(nèi)容覆蓋成新的內(nèi)容10句,"你好,世界!!"
//Write2()
//打開一個存在的 文件,將原來的內(nèi)容追加內(nèi)容"ABC! ENGLISH!"
//Write3()
//打開一個存在的文件,將原來的內(nèi)容讀出顯示在終端,并追加5句"hello,北京"
Write4()
}
func Read1(){
//防止控制臺中文亂碼 如果是Golang編譯則需要安裝第三方轉(zhuǎn)碼包git clone https://github.com/axgle/mahonia.git
var enc mahonia.Decoder
enc = mahonia.NewDecoder("gbk")
//讀取文件的內(nèi)容并顯示在終端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
//打開文件 file,err:=os.Open(文件的絕對路徑)
file,err:=os.Open("F:/test.txt")
if err !=nil{
fmt.Println("open file err=",err)
}
//關(guān)閉文件
defer file.Close() //要及時關(guān)閉文件,否則會有內(nèi)存泄露
//創(chuàng)建一個"Reader",帶緩存 默認(rèn)緩存大小為4096 reader:=bufio.NewReader(file)
reader:=bufio.NewReader(file)
//讀取文件的內(nèi)容
for{
str,err:=reader.ReadString('\n')
fmt.Print(enc.ConvertString(str))
/*
你好啊
真的很好asdb
123
*/
if err ==io.EOF{// 文件末尾
break
}
}
}
func Read2(filename string,encode string){
var enc mahonia.Decoder
enc = mahonia.NewDecoder(encode)
//一次性讀取文件內(nèi)容,適用于文件較小的 無需開啟和開啟文件
// 使用 ioutil.ReadFile content為byte[]
content,err:=ioutil.ReadFile(filename)
if err!=nil{
fmt.Println("read file err=",err)
}
fmt.Print(enc.ConvertString(string(content)))
}
func Write(){
filename:="f:/test2.txt"
//創(chuàng)建文件,并以只寫形式打開
file,err:=os.OpenFile(filename,os.O_CREATE |os.O_WRONLY,0666)
if err !=nil{
fmt.Println("open file err=",err)
return
}
defer file.Close()
//寫入內(nèi)容
str:="hello,Gardon\r\n"
//寫入時,帶有緩存的*Writer
writer:=bufio.NewWriter(file)
for i:=0;i<5 ;i++ {
writer.WriteString(str)
}
//刷新緩存
writer.Flush()
//讀取文件
Read2(filename,"gbk")
/*
hello,Gardon
hello,Gardon
hello,Gardon
hello,Gardon
hello,Gardon
*/
}
func Write2(){
filename:="f:/test2.txt"
//創(chuàng)建文件,并以只寫形式打開
file,err:=os.OpenFile(filename,os.O_CREATE |os.O_TRUNC,0666)
if err !=nil{
fmt.Println("open file err=",err)
return
}
defer file.Close()
//寫入內(nèi)容
str:="你好,世界!!\r\n"
//寫入時,帶有緩存的*Writer
writer:=bufio.NewWriter(file)
for i:=0;i<10 ;i++ {
writer.WriteString(str)
}
//刷新緩存
writer.Flush()
//讀取文件
Read2(filename,"utf-8")
/*
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
*/
}
func Write3(){
filename:="f:/test2.txt"
//創(chuàng)建文件,并以只寫形式打開
file,err:=os.OpenFile(filename,os.O_CREATE |os.O_APPEND,0666)
if err !=nil{
fmt.Println("open file err=",err)
return
}
defer file.Close()
//寫入內(nèi)容
str:="ABC! ENGLISH!\r\n"
//寫入時,帶有緩存的*Writer
writer:=bufio.NewWriter(file)
writer.WriteString(str)
//刷新緩存
writer.Flush()
//讀取文件
Read2(filename,"utf-8")
/*
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
ABC! ENGLISH!
*/
}
func Write4(){
filename:="f:/test2.txt"
//創(chuàng)建文件,并以只寫形式打開
file,err:=os.OpenFile(filename,os.O_RDWR |os.O_APPEND,0666)
if err !=nil{
fmt.Println("open file err=",err)
return
}
defer file.Close()
//追加內(nèi)容
Read2(filename,"utf-8")
/*
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
ABC! ENGLISH!
*/
str:="hello,北京\r\n"
//寫入時,帶有緩存的*Writer
writer:=bufio.NewWriter(file)
writer.WriteString(str)
//刷新緩存
writer.Flush()
//讀取文件
Read2(filename,"utf-8")
/*
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
你好,世界!!
ABC! ENGLISH!
hello,北京
*/
}
寫操作案例
查看文件或目錄是否存在
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(PathExists("f:/test2.txt")) //true <nil>
fmt.Println(PathExists("f:/test3.txt")) //false <nil>
}
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
//如果返回的錯誤為nil,說明文件或文件夾存在
if err == nil {
return true, nil
}
//如果返回的錯誤類型使用os.IsNotExist()判斷為true,說明文件或文件夾不存在
if os.IsNotExist(err){
return false, nil
}
//如果返回的 錯誤為其他類型,則不確定是否在存在
return false,err
}
拷貝文件
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
fmt.Println(PathExists("f:/test2.txt")) //true <nil>
fmt.Println(PathExists("f:/test3.txt")) //false <nil>
written,err:=CopyFile("f:/test3.txt","f:/test2.txt")
if err!=nil{
fmt.Println("拷貝失敗!!")
}else{
fmt.Println("拷貝成功!!")
}
fmt.Println(written)
}
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
//如果返回的錯誤為nil,說明文件或文件夾存在
if err == nil {
return true, nil
}
//如果返回的錯誤類型使用os.IsNotExist()判斷為true,說明文件或文件夾不存在
if os.IsNotExist(err){
return false, nil
}
//如果返回的 錯誤為其他類型,則不確定是否在存在
return false,err
}
func CopyFile(writerFileName string,readerFileName string) (written int64,err error){
ReaderFile,err2:=os.Open(readerFileName)
WriterFlag,_:=PathExists(writerFileName)
var WriterFile *os.File
if WriterFlag{
WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_TRUNC,0666)
}else{
WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_CREATE,0666)
}
if err !=nil{
fmt.Println("file open err=",err)
return
}
writer:=bufio.NewWriter(WriterFile)
defer WriterFile.Close()
if err2 !=nil{
fmt.Println("file open err=",err2)
return
}
defer ReaderFile.Close()
reader:=bufio.NewReader(ReaderFile)
return io.Copy(writer,reader)
}以上就是Go語言文件讀寫操作案例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語言文件讀寫操作的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Go中實現(xiàn)和使用堆棧以及先進(jìn)先出原則詳解
Go是一種功能強(qiáng)大的編程語言,提供了豐富的數(shù)據(jù)結(jié)構(gòu)和算法,堆棧是計算機(jī)科學(xué)中的基本數(shù)據(jù)結(jié)構(gòu)之一,在本博文中,我們將探討如何在?Go?中實現(xiàn)和使用堆棧,以及堆棧如何遵循先進(jìn)先出?(FIFO)?原則2023-10-10
Golang實現(xiàn)for循環(huán)運(yùn)行超時后自動退出的方法
for循環(huán)對大家來說應(yīng)該都不陌生,對于golang來說更是必不可少,所以下面這篇文章就來給大家介紹了關(guān)于Golang如何實現(xiàn)for循環(huán)運(yùn)行一段時間超時后自動退出的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Go檢查結(jié)構(gòu)體中是否存在某個字段及創(chuàng)建結(jié)構(gòu)體切片或映射
這篇文章主要為大家介紹了Go檢查結(jié)構(gòu)體中是否存在某個字段及創(chuàng)建結(jié)構(gòu)體切片或映射實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

