一 、读文件
1.io包主要有两大接口Reader和Writer,分别定义了read()和write()方法
2.这两个接口有os.File,fmt包,bufio包,strings包中都有实现
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
func main() {
/**
带缓冲区读取文件
*/
//file是一个指针,也称file对象,file文件句柄
file, err := os.Open("/Users/seeker/Desktop/go.rtf")
if err != nil {
fmt.Printf("error=%v", err)
}
//函数退出需要close(),否则内存泄露
defer file.Close()
//默认缓冲区4096,读一部分处理一部分
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
if err == io.EOF { //表示读到文件末尾
break
}
fmt.Print(str)
}
/**
一次性将文件读取到位,适合文件较小情况
*/
content, err1 := ioutil.ReadFile("/Users/seeker/Desktop/go.rtf")
if err1 != nil {
fmt.Printf("open file fail,err=%v", err1)
}
fmt.Printf("%v\n", content) //content 是 []byte 切片
fmt.Printf("%v\n", string(content)) //[]byte转string
}
二、写文件
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//文件名;文件模式,此例为只读,未存在文件就创建文件;权限控制,四个占位符,仅win无效
file, err := os.OpenFile("/Users/seeker/Desktop/go3.txt", os.O_WRONLY|os.O_CREATE, 4444)
if err != nil {
fmt.Printf("err = %v\n", err)
return
}
defer file.Close()
//带缓存
write := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
write.WriteString("Hello Go\n")
}
//内容是先写入缓存的,此方法将缓冲的数据真正写入文件
write.Flush()
}
三、拷贝文件
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
dstFileName := "/Users/seeker/Desktop/abc.png"
srcFileName := "/Users/seeker/Desktop/10公里.png"
_, err := copyFile(dstFileName, srcFileName)
if err != nil {
fmt.Printf("copy fail ,err=%v\n", err)
} else {
fmt.Println("拷贝成功")
}
}
/**
拷贝图片,音频,视频
dstFileName 目的文件路径 srcFileName 待拷贝文件路径
*/
func copyFile(dstFileName string, srcFileName string) (written int64, err error) {
srcfile, err := os.Open(srcFileName)
if err != nil {
fmt.Printf("open file,err=%v\n", err)
}
defer srcfile.Close()
reader := bufio.NewReader(srcfile)
dstFile, err := os.OpenFile(dstFileName, os.O_RDWR|os.O_CREATE, 4444)
if err != nil {
fmt.Printf("open file,err=%v\n", err)
return
}
defer dstFile.Close()
writer := bufio.NewWriter(dstFile)
return io.Copy(writer, reader)
}