Reader读取文件
package main
import (
"fmt"
"os"
"bufio"
"io"
)
func main(){
file, err := os.Open("./test.txt")
if err != nil {
fmt.Println("open file err=",err)
}
//当函数推出时,要及时关闭,否则会有内存泄漏
defer file.Close()
//创建一个 *Render,是带缓冲的
reader := bufio.NewReader(file)
fmt.Println()
for {
str, err := reader.ReadString('\n') //读到一个换行结束
if err == io.EOF { //io,EOF表示文件末尾
break
}
fmt.Print(str)
}
fmt.Println("文件读取结束")
}
./test.txt
你好
golang
恭喜打开了
注意: 上面有四列,不然最后一行是不会打印输出的
一次性读取文件
这种适用于文件不太大的情况下
因为我们没有显示的open
import (
"fmt"
"io/ioutil"
)
func main(){
file := "./test.txt"
content,err := ioutil.ReadFile(file)
if err != nil{
fmt.Println("read file err=",err)
}
//把读取到的内容显示到终端
fmt.Printf("%v",content) //[]byte
//我们没有显式的Open文件,因此也不需要显式的Close文件
//因为文件的Open和Close被封装到ReadFile函数内部
}
创建文件并写入内容
另一种使用
bufio.NewWriter
package main
import (
"fmt"
"os"
"bufio"
)
func main(){
//创建新文件,写入内容: 5句"hello Gardon"
filePath := "./abc.txt"
file, err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)
if err != nil {
fmt.Printf("open file err=%v\n",err)
return
}
defer file.Close()
str := "hello Gardon\n"
writer := bufio.NewWriter(file)
for i:=0; i<5; i++ {
writer.WriteString(str)
}
//因为writer是带缓存,因此在调用WriteString方法时,其实内容是先写到缓存的,所以
//需要用到Flush方法,将缓冲的数据真正写到文件中,否则文件中会没有数据
writer.Flush()
}
写文件的四种方法
os.O_WRONLY
: 打开os.Q_TRUNC
: 清空os.O_APPEND
: 追加os.RDWR
:读写的方式打开
判断文件和目录存在
func PathExists(path string)(bool,error){
_,err := os.Start(path)
if err == nil {
return true,nil
}
if os.isNotExists(err){
return false,nil
}
return false,err
}
拷贝文件(图片视频音频)
//dstFileName: 新的文件; srcFileName:存在的文件
func myCopyFunc(dstFileName string,srcFileName string)(written int16,err error){
srcFile,err := os.Open(srcFileName)
if err != nil {
fmt.Printf("open file err=%v\n",err)
return
}
defer srcFile.Close()
//通过srcFile,获取到Reader
reader := bufio.NewReader(srcFile)
//打开dstFileName
dstFile,err := os.OpenFile(dstFile,os.O_WRONLY|os.O_CREATE,0666)
if err != nil {
fmt.Printf("open file err=%v\n",err)
return
}
//通过dstFile,获取Writer
writer := bufio.NewWriter(distFile)
defer dstFile.Close()
}