11、go的文件操作
文件
创建一个测试文件
代码测试:
func main() {
// 打开文件
file, err := os.Open("E:/test/Test.txt")
if err != nil { // err不为空,说明报错
fmt.Println("文件打开出错:", err)
}
fmt.Printf("文件:%v", file) // 文件:&{0xc00010a780}
// 关闭文件:
err2 := file.Close()
if err2 != nil {
fmt.Println("关闭文件失败")
}
}
io引入
读取文件
func main() {
// 不需要进行流的打开/关闭操作,这些封装在ReadFile函数里面了
// 读取文件,返回:[]byte, err
file, err := ioutil.ReadFile("E:/test/Test.txt")
if err != nil {
fmt.Println("读取有误:", err)
}
fmt.Printf("%v", string(file)) // hello,golang
}
使用带缓冲区的方式:
比如这个文件的内容很多,有很多行
func main() {
// 打开文件
file, err := os.Open("E:/test/Test.txt")
if err != nil {
fmt.Println("文件打开失败")
}
// 函数退出时,让file关闭,防止内存泄露
defer file.Close()
// 创建一个流
reader := bufio.NewReader(file)
// 进行读取操作
for {
// 读取到换行就结束
str, err := reader.ReadString('\n')
// io.EOF表示读取到文件结尾
if err == io.EOF {
break
}
// 如果没有读取到文件结尾,就正常输出
fmt.Println(str)
}
// 结束
fmt.Println("文件读取成功,并全部读取完毕")
}
打印:
写出文件
func main() {
// 写入文件:
// 先打开文件,在E:/test目录下会生成一个文件demo.txt
// 参数2:文件打开模式, 参数3:权限控制
file, err := os.OpenFile("E:/test/demo.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
if err != nil {
fmt.Println("打开文件失败:", err)
}
// 及时关闭文件
defer file.Close()
// 写入文件操作: IO流 --> 缓冲输出流(带缓冲区)
writer := bufio.NewWriter(file)
// 写入10句你好到缓冲区里面
for i := 0; i < 10; i++ {
writer.WriteString("你好")
}
// 刷新数据,把数据刷到磁盘
writer.Flush()
// 查看一下0666是什么权限,代表什么意思
s := os.FileMode(0666).String()
fmt.Println(s) // -rw-rw-rw-
}
允许完代码,查看对应路径下的文件,写入成功
文件复制操作
就是去读一个文件,然后把这个文件的内容写出去
func main() {
// 定义源文件
file1Path := "E:/test/demo.txt"
// 定义目标文件
file2Path := "E:/test/demo2.txt"
// 对文件进行读取
content, err := ioutil.ReadFile(file1Path)
if err != nil {
fmt.Println("读取有问题")
return
}
// 写出文件
err = ioutil.WriteFile(file2Path, content, 0666)
if err != nil {
fmt.Println("写出失败")
}
}
运行完代码后,到对应目录查看写出去复制好的文件
《三体》中有句话——弱小和无知不是生存的障碍,傲慢才是。
所以我们不要做一个小青蛙