os.Create:文件不存在则创建,文件存在则删除文件中的内容
语法:
file:创建文件的指针
err:创建文件出现异常后的信息
file, err := os.Create("创建文件存放的路径")
演示:
func CreateFile() {
file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
if err != nil {
fmt.Println(err)
}
// 关流(不关流会长时间占用内存)
defer file.Close()
}
写入数据:
使用WriteString写数据:
WriteString底层也是调用的Write,但是Write需要转换字节数组,比较麻烦,WriteString不需要手动转换,比较方便
func FileWriteString() {
// 创建文件
file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
if err != nil {
fmt.Println(err)
}
defer file.Close()
// WriteString写数据,返回值参数1是写的字符长度,参数2是异常信息
len, err := file.WriteString("WriteString写入的数据")
if err != nil {
fmt.Println(err)
}
fmt.Println(len)
}
使用Write写数据:
func FileWrite() {
// 创建文件
file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
if err != nil {
fmt.Println(err)
}
defer file.Close()
// Write写数据,返回值参数1是写的字符长度,参数2是异常信息
str := "Write写入的数据"
len, err := file.Write([]byte(str)) //将字符串转换成字节切片
if err != nil {
fmt.Println(err)
}
fmt.Println(len)
}
使用WriteAt写数据:在指定的位置写入数据
func FileWriteAt() {
// 创建文件
file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")
if err != nil {
fmt.Println(err)
}
defer file.Close()
// WriteAt写数据,返回值参数1是写的字符长度,参数2是异常信息
// WriteAt写数据,参数列表中参数1是要写的数据,参数2是要写入数据的开始索引
var str string = "WriteAt写入的数据"
num, _ := file.Seek(0, io.SeekEnd) //SeekEnd:将数据追加到源文件,参数一:追加数据的开始索引,
fmt.Println("num:", num)
len, err := file.WriteAt([]byte(str), num)
if err != nil {
fmt.Println(err)
}
fmt.Println(len)
}
OpenFile追加数据:
文件里已经有数据的情况下,用上面的三种方式去写,会出现覆盖的效果,WriteAt可以指定索引,但是比较麻烦。
os.OpenFile():打开指定文件进行操作
OpenFile有三个参数:参数1:打开文件的路径参数2:模式,常见的模式有
| 参数 | 说明 |
|---|---|
| O_RDONLY | 只读方式打开 |
| O_WRONLY | 只写方式打开 |
| O_RDWR | 读写方式打开 |
| O_APPEND | 追加方式打开 |
| O_CREATE | 不存在,则创建 |
| O_EXCL | 如果文件存在,且标定了O_CREATE的话,则产生一个错误 |
| O_TRUNG | 如果文件存在,且它成功地被打开为只写或读写方式,将其长度裁剪唯一(覆盖) |
| O_NOCTTY | 如果文件名代表一个终端设备,则不把该设备设为调用进程的控制设备 |
| O_NONBLOCK | 如果文件名代表一个FIFO,或一个块设备,字符设备文件,则在以后的文件及I/O操作中置为非阻塞模式 |
| O_SYNC | 当进行一系列写操作时,每次都要等待上次的I/O操作完成再进行 |
参数3:表示权限,取值范围(0-7),和linux里操作文件那个读写一样
0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3:写权限与执行权限
4:读权限
5:读权限与执行权限
6:读权限与写权限
7:读权限,写权限,执行权限
演示:
func OpenFileTest() {
// 追加写数据
file, err := os.OpenFile("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt", os.O_APPEND|os.O_WRONLY, 6)
if err != nil {
fmt.Println(err)
}
defer file.Close()
// 通过文件指针读写数据
len, err := file.WriteString("t我追加了吗")
if err != nil {
fmt.Println(err)
}
fmt.Println(len)
}
Open读取文件:
读取指定文件的数据
演示:
func OpenFileTest2() {
// 追加写数据
file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
// 读数据,定义一个切片存储文件读取的数据
buffer := make([]byte, 1024)
len, err := file.Read(buffer)// len:读取文件中的数据长度
if err != nil {
fmt.Println(err)
}
fmt.Println(len)
//fmt.Println(buffer) // 直接打印都是数字(ascii码值),长度是1024,数据没满的时候就会用默认值0代替,可以使用截取操作
fmt.Println(buffer[:len])
fmt.Println(string(buffer[:len])) // 将类型转换为string,可以展示出内容
}
ReadBytes缓冲区读取:
在使用ReadBytes( )函数读取数据时,需要用到缓冲区,所谓缓冲区就是存储数据的区域,也就是先将从文件中读取的数据存储在该区域内,然后在将区域中的数据取出来,写到磁盘上。
提供缓冲区的原因是:
为了缓和 CPU 与 磁盘设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。
演示:
func ReadBytesTest() {
// 追加写数据
file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
// 读数据,定义一个切片存储文件读取的数据
r := bufio.NewReader(file)
for {
buf, err := r.ReadBytes('n')
if err == io.EOF { // 文件末尾
break
}
fmt.Println(err)
fmt.Println("buf", string(buf))
}
}



