1、输入输出流
2、os.FIle用于表示一个打开的文件对象,在文件的操作中都需要使用File
2.1、打开文件和关闭文件
func main() {
//1、文件入门 -打开一个文件
file, err := os.Open("e:/test.txt")
if err != nil {
fmt.Println("open file err=", err)
}
//输出文件 ,file是一个指针 *File
fmt.Printf("file=%v", file)
//关闭文件
err = file.Close()
if err != nil {
fmt.Println("close file err=", err)
}
}
结果:可见file是一个指针
3、文件读取操作
func main(){
//1、创建file对象
file, err := os.Open("e:/test.txt")
if err != nil {
fmt.Println("open file error:", err)
}
//defer延迟机制 当函数执行完再执行defer后的语句
//关闭文件
defer file.Close()
//2、创建 *Reader 读文件对象 (带缓冲)
const (
//设置默认的缓冲区为4096
defaultBufSize = 4096
)
reader := bufio.NewReader(file)
//4、循环读取文件内容
for {
//当读到一个换行本次读取结束
str, err := reader.ReadString('\n')
//io.EOF表示文件的末尾
if err == io.EOF {
break
}
fmt.Println(str)
}
fmt.Println("文件读取结束")
}
结果:中文乱码,后面再解决
4、os.OpenFile函数
练习:创建一个新文件并写入 hello golang
func main(){
//3、创建一个新文件并写入 hello golang
filePath := "e:/test.txt"
//os.O_WRONLY|os.O_CREATE只写模式打开文件,若文件不存在则创建文件
//file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
//os.O_TRUNC:打开文件时清空文件内容
//file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0666)
//os.O_APPEND:将要写入的内容添加的文件末尾
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
fmt.Println("openFile err", err)
//结束函数
return
}
//及时关闭file语柄
defer file.Close()
str := "hello golang\n"
//带缓存的wirter
writer := bufio.NewWriter(file)
//向test.txt中写入五次 hello golang
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
//因为writer是带缓存的,因此在调用writerstring方法是,其实先将内容写到缓存中,
//需要调用flush方法,将缓冲的数据真正的写入到文件中
writer.Flush()
}
结果:
5、ioutil.ReadFile/ioutil.WriteFile 向文件读取/写入数据
练习:将一个文件中的内容复制到另一个文件中
//4、将一个文件中的内容复制到另一个文件中
filePath := "e:/test.txt"
fileCopyPath := "e:/testCopy.txt"
//读取源文件中的内容
data, err := ioutil.ReadFile(filePath)
if err != nil {
fmt.Println("read file err:", err)
return
}
//判断文件是否存在
str, err := os.Stat(fileCopyPath)
if err != nil {
fmt.Println("file isnot found", err)
}
err = ioutil.WriteFile(fileCopyPath, data, 0666)
if err != nil {
fmt.Println("write data err:", err)
}
结果:
从控制台可见文件不存在,但outil.WriteFile()会在文件不存在时会创建文件
6、func Copy(dst Writer,srcReader)(written int 64,err error) io包提供的文件copy函数
使用:
func main(){
//5、文件copy
filePath := "e:/iu.jpg"
fileCopyPath := "e:/iuCopy.jpg"
//打开文件
file, err := os.Open(filePath)
if err != nil {
fmt.Println("openFile err:", err)
return
}
fileCopy, err := os.OpenFile(fileCopyPath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("openFile err:", err)
return
}
//延时关闭文件
defer file.Close()
defer fileCopy.Close()
//创建读写流
reader := bufio.NewReader(file)
writer := bufio.NewWriter(fileCopy)
//复制操作
intVal, err := io.Copy(writer, reader)
if err != nil {
fmt.Println("复制失败", err)
} else {
fmt.Println("复制成功,源文件大小:", intVal)
}
}
结果: