package main
// 1、导入"os"包,创建,读,写文件的函数都在该包
import (
"fmt"
"os"
)
func main() {
// 2、创建文件,可以写绝对路径或者相对路径
fp,err := os.Create("./a.txt")
// Create()方法默认返回两个参数,文件指针和错误信息
if err!=nil{
// 路径不存在; 文件权限; 程序打开文件上限
fmt.Println("文件创建失败")
return
}
// 3、写入文件操作
count,err1 := fp.WriteString("我去买些橘子,你就在此地,不要随意走动")
if err1!=nil {
fmt.Println("写入文件失败")
return
}else {
fmt.Println(count)
}
// 4、关闭文件,如果打开文件不关闭,造成内存的浪费,程序打开文件的数量有上限
defer fp.Close()
}
(1)创建文件:Create()函数
①在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空;
②当文件创建成功后,该文件会默认的打开,所以不用在执行打开操作,可以直接向该文件中写入数据;
(2)写入文件:
方法一:WriteString(参数为字符串):方法默认返回两个参数,写入的数据长度和错误信息;
count,err1 := fp.WriteString("我去买些橘子,你就在此地,不要随意走动")
方法二:Write(参数为字节切片)方法默认返回两个参数,写入的数据长度和错误信息;
count,err1 := fp.Write([]byte("性感老王在线授课"))
方法三:WriteAt(参数为字节切片, 写入位置):指定位置写入数据,该方法默认返回两个参数,写入的数据长度和错误信息
获取文件起始到结尾有多少个字符
方法① count,_ := fp.Seek(0, io.SeekEnd)
方法② count,_ := fp.Seek(0, os.SEEK_END)
指定位置写入
fp.WriteAt([]byte("hello world"), count)
fp.WriteAt([]byte("hahaha"), 0)
fp.WriteAt([]byte("秀儿"), 19)
方法四:OpenFile():向已有文件中追加数据
// 该方法默认返回两个参数,写入的数据长度和错误信息
os.OpenFile(文件名,打开方式,打开权限)
fp,err := os.OpenFile("D:/a.txt", os.O_RDWR, 6)
if err!=nil {
fmt.Println("打开文件失败")
}
fp.WriteString("hello")
fp.WriteAt([]byte("hello"),25)
defer fp.Close()
总结:
OpenFile(要打开文件的路径, 打开模式, 打开权限)
常见的模式有:
O_RDONLY(只读模式),
O_WRONLY(只写模式),
O_RDWR(可读可写模式),
O_APPEND(追加模式)。
权限,取值范围(0-7)
0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3: 写权限与执行权限
4:读权限
5: 读权限与执行权限
6: 读权限与写权限
7: 读权限,写权限,执行权限
(3)读取文件:
方法一:Read()函数
// 在使用Read()函数读取文件中的内容时,需要一个切片类型
buf := make([]byte, 1024*2) // 2k大小
// n 代表从文件读取内容的长度
n, err1 := fp.Read(buf)
// 除了对其判断是否出错时以外,还要判断是否读到文件末尾(这里需要导入io包)
if err1 != nil && err1 != io.EOF {
fmt.Println("err1=", err1)
return
}
// Read()函数将文件的内容全部读取出来,然后存放在切片中
fmt.Println("buf=", string(buf[:n]))
方法二:Open():只读方式打开文件
fp, err := os.Open("D:/a.txt")
if err != nil {
fmt.Println("err=", err)
return
}
方法三:上面我们是将文件的内容全部读取出来,然后存放在切片中,我们也可以每次只读取一行数据,需要用到bufio包的ReadBytes()函数;
① 打开文件
fp, err := os.Open("D:/a.txt")
if err != nil {
fmt.Println("打开文件失败", err)
return
}
② 创建缓冲区:文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间
r := bufio.NewReader(fp)
③ 循环读取文件中的内容,直到文件末尾位置
for {
// 遇到'\n'结束读取,但是'\n'也读取进入
buf,err := r.ReadBytes('\n')
fmt.Println("buf = ",string(buf))
if err != nil {
if err == io.EOF {
break
}
fmt.Println("err=",err)
}
}
在使用ReadBytes( )函数时,传递的参数是‘\n’,表示遇到’\n’就结束,所以使用了死循环(每循环一次,读取一行数据),只有到文件末尾了,
才退出整个循环。最后,将读取的数据打印出来,注意ReadBytes( )返回的是字节切片,所以在打印时要转换成字符串
④ 关闭文件
defer fp.Close()