前言大家好,我是码农,周五,这次来聊聊文件操作。文件操作简单,比如打开word、excel,都是文件操作。当然,我们一定不能直接操作word。先从最简单的普通文件开始吧!打开和关闭文件packagemainimport"os"funcmain(){//os.Open是只读模式的fileObj,err:=os.Open("neverflinch.txt")iferr!=nil{panic(err)}//关闭文件fileObj.Close()//一般情况下,使用此方法关闭文件deferfileObj.Close()}注意:如果你使用的是Goland,在学习文件操作时,尽量不要右键运行,因为查找文件的路径不同。尽量编译成.exe文件,所以是找当前目录读取文件读取指定大小代码funcmain(){//os.open是只读模式fileObj,err:=os.Open("Nevershrink.txt")iferr!=nil{panic(err)}varfileBytes=make([]byte,128)n,err:=fileObj.Read(fileBytes)iferr!=nil{panic(err)}fmt.Println(string(fileBytes[:n]))//一般情况下,使用该方法关闭文件deferfileObj.Close()}执行结果可以发现根本没有被读取,并且字符乱码。阅读整个文件。上面我们只读了128个字节,一个汉字3个字节,128/3,除去标点符号,应该是40个左右,这显然是不够的,那怎么办才能全部读完呢??我们只读了上面的128个字节。我们可以读取128个字节,然后每次读取都找一个jar放进去。读取加载后,完美代码funcmain(){//os.Open是只读模式下的fileObj,err:=os.Open("Neverflinch.txt")iferr!=nil{panic(err)}//一般用这种方法关闭文件deferfileObj.Close()varjar[]stringvareachreadbyte=make([]byte,128)for{n,err:=fileObj.Read(eachreadbyte)//err==io.EOF表示读取完成,必须放在err!=niliferr==io.EOF{break}iferr!=nil{panic前面(err)}vareachreadstring=string(eachreadbyte[:n])jar=append(jar,每次读取字符串)}fmt.Println(jar)}执行结果会发现还是有乱码,为什么是这样???这是因为我们每次读取的都是bytes一部分,一部分,但是中文是3个字节,有的时候可能全都截错了,会出现乱码,怎么办?没办法,默认的读取文件的功能也就这么点,更多的功能都在bufiobufiobufio中了,可以理解为对原文件操作的加强版。它比上面的文件更棒,功能更多。来看看如何完美阅读代码funcmain(){//os.Open是只读模式fileObj,err:=os。Open("Neverbackdown.txt")iferr!=nil{panic(err)}//通常使用此方法关闭文件deferfileObj.Close()//需要将文件对象传入reader:=bufio.NewReader(fileObj)for{//逐行读取,err:=reader.ReadString('\n')//参数是字符,不是字符串iferr==io.EOF{break}iferr!=nil{panic(err)}fmt.Printf("%v",row)}}执行结果读取整个文件可能有人又说了,啊,周五了,我还是觉得麻烦,有没有更简单的读取文件的方法,必须有,一次全部读取?答案是肯定的,此时需要使用ioutil包代码funcmain(){//os.Open为只读模式字节,err:=ioutil.ReadFile("nevershrink.txt")iferr!=nil{panic(err)}fmt.Println(string(bytes))}执行结果但是这个有一个缺点,只能读取小文件,如果要玩10G的文件,保证电脑死机!!!如果要写入一个文件,我们需要使用openFile方法打开它在开始文件之前,记住以下模式os.O_WRONLY只写os.O_RDONLY只读os.O_CREATE如果文件不存在,创建文件os.O_RDWR可读可写os.O_TRUNC清除os.O_APPEND添加文件写入字节和写入行代码funcmain(){fileObj,err:=os.OpenFile("Temporary.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666)iferr!=nil{panic(err)}deferfileObj.Close()w_content:="我是临时表的内容\n"//write方法需要将字符串转成bytesfileObj.Write([]byte(w_content))//WriteString直接写入字符串fileObj.WriteString(w_content)}执行结果bufio写入文件代码funcmain(){fileObj,err:=os.OpenFile("Temporary.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666)iferr!=nil{panic(err)}deferfileObj.Close()w_content:="我是临时表的内容\n"writer:=bufio.NewWriter(fileObj)writer.Write([]byte(w_content))writer.WriteString(w_content)//写入完成必须flushintowriter.Flush()}执行结果ioutilwritefilecodefuncmain(){w_content:=&quo吨;我是临时表的内容\n"err:=ioutil.WriteFile("Temporary.txt",[]byte(w_content),0666)iferr!=nil{panic(err)}}执行结果copyfilecopyfile,只是复制文件,将A文件复制到B文件,其实它的底层还是打开了这两个文件,将A文件的内容写入到B文件中代码funcmain(){原始文件,err:=os.Open("Nevershrink.txt")iferr!=nil{panic(err)}deferoriginalfile.Close()目标文件,err:=os.OpenFile("Temp.txt",os.O_WRONLY|os.O_CREATE,0666)iferr!=nil{panic(err)}defertargetfile.Close()//copyfileio.Copy(targetfile,originalfile)}执行结果总结本章主要学习文件操作的相关知识,其中主要分为读取文件读写有native方法,增强型读写有bufio和一次性读写的ioutil,推荐大家使用bufio包来操作文件,它有一个buffer功能和更好的性能!!要有别人不能拥有的
