go – 文件操作(1)读与写
众所周知,文件是数据源(数据保存的地方),常见类型的文件大家其实都不陌生
很显然文件是以流的形式来操作的
//流:数据在文件和程序之间经历的路径
//输入流:数据从文件到程序的路径
//输出流:数据从程序到文件的路径
在打开和关闭文件,我们一般使用os模块下的函数,直接贴一段官方函数解释
一般是使用Open来调用一个文件,但是OpenFile可以制定一些参数
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件,也就是将文件覆盖
)
比如说flag就可以指定这一些,之后我们会举例的
关于读的操作
读的操作分为一次性读取和缓冲式读取
首先来介绍一下一次性读取,一次性读取并不需要os模块下的open,而是直接通过string读取文件的名字,并且返回一个[]byte类型,很显然这种方式并不适合大文件的读取,十分的占空间
package main
import (
"fmt"
"io/ioutil"
)
func main(){
file := "./test.txt" //读取当前目录下的一个文件
content,err := ioutil.ReadFile(file)
if err !=nil{
fmt.Println("\n文件读取结束")
}
fmt.Printf("%v",string(content))
}
接下来介绍一下缓冲式读取文件
缓冲式读取需要通过bufio这一个模块
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()
//当函数退出时,要及时的关闭file,否则会有内存泄漏
//创建一个 *Reader ,是带有缓冲的
/*
const(
defaultBufSize = 4096 //默认缓冲区为4096
)
这种方式一般用于读取大文件,分多次提取
*/
reader := bufio.NewReader(file)
//循环的读取文件的内容
for {
str,err := reader.ReadString('\n')
fmt.Print(str)
if err == io.EOF{ //io.EOF表示文件的末尾
fmt.Println("\n文件读取结束...")
break
}
}
}
关于写的操作
写的操作如果是也是缓冲类型的话,那么同样也是需要先os来调用打开文件,指定写的权限操作,然后使用bufio模块进行写
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件,也就是将文件覆盖
)
package main
import(
"fmt"
"bufio"
"os"
)
func main(){
f_path := "./abc.txt"
file,err := os.OpenFile(f_path, os.O_WRONLY|os.O_CREATE, 0666) //这一类的参数查看官方文档,windows下0666没反应
if err != nil{
fmt.Printf("open file err=%v\n",err)
return
}
defer file.Close()
str := "hello,duan\n" //在某些版本过低的系统,换行需要添加\r这样的符号来识别\n str := "hello,duan\r\n" ,至少在win10就不用添加这个
write := bufio.NewWriter(file) //写入的时候其实是具有一个缓存的,需要使用一个Flush方法来将缓冲的数据真正写入文件,否则会丢失
for i:=0;i<5;i++{
write.WriteString(str)
}
write.Flush() //注意的是写了之后一定一定要Flush一下
}
er(file) //写入的时候其实是具有一个缓存的,需要使用一个Flush方法来将缓冲的数据真正写入文件,否则会丢失
for i:=0;i<5;i++{
write.WriteString(str)
}
write.Flush() //注意的是写了之后一定一定要Flush一下
}