跳到主要内容

读写文件

4.1、打开文件

os.Open()函数能够打开一个文件,返回一个*File和一个err

//打开文件
file, err := os.Open("./满江红")
if err != nil {
fmt.Println("err: ", err)
}

//关闭文件句柄
defer file.Close()

4.2、读文件

package main

import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)

func readBytes(file *os.File) {
var b = make([]byte, 3)
n, err := file.Read(b)
if err != nil {
fmt.Println("err:", err)
return
}
fmt.Printf("读取字节数:%d\n", n)
fmt.Printf("切片值:%v\n", b)
fmt.Printf("读取内容:%v\n", string(b[:n]))
}

func readLines(file *os.File) {
reader := bufio.NewReader(file)
for {
// (1) 按行都字符串
strs, err := reader.ReadString('\n') // 读取到换行符为止,读取内容包括换行符
fmt.Print(err, strs)

// (2) 按行都字节串
// bytes, err := reader.ReadBytes('\n')
// fmt.Print(bytes)
// fmt.Print(string(bytes))
if err == io.EOF { //io.EOF 读取到了文件的末尾
// fmt.Println("读取到文件末尾!")
break
}
}
}

func readFile() {
content, err := ioutil.ReadFile("满江红") //包含了打开文件和读取整个文件,适用于较小文件
if err != nil {
fmt.Println("read file failed, err:", err)
return
}
fmt.Print(string(content))
}

func main() {
//打开文件
file, err := os.Open("满江红") // 相对路径或者绝对路径
if err != nil {
fmt.Println("err: ", err)
}
//关闭文件句柄
defer file.Close()

// (1) 按字节读取数据
// readBytes(file)
// (2) 按行读取文件
// readLines(file)
// (3) 读取整个文件
// readFile()
}

4.3、写文件

OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

func OpenFile(name string, flag int, perm FileMode) (file *File, err error) // ⽂件路径、打开模式、⽂件权限

/*
os.O_RDONLY: 只读模式(read-only)
os.O_WRONLY: 只写模式(write-only)
os.O_RDWR : 读写模式(read-write)
os.O_APPEND: 追加模式(append)
os.O_CREATE: ⽂件不存在就创建(create a new file if none exists.)
os.O_TRUNC: 打开并清空⽂件(必须有写权限)
os.O_EXCL: 如与 O_CREATE ⼀起⽤,构成⼀个新建⽂件的功能,它要求⽂件必须不存在(used with O_CREATE, file must not exist)
os.O_SYNC:同步⽅式打开,即不使⽤缓存,直接写⼊硬盘
*/

(1)只写模式

package main

import (
"bufio"
"fmt"
"io/ioutil"
"os"
)

func writeBytesOrStr(file *os.File) {
str := "满江红666\n"
//写入字节切片数据
file.Write([]byte(str))
//直接写入字符串数据
file.WriteString("怒发冲冠,凭栏处、潇潇雨歇。")
}

func writeByBufio(file *os.File) {
writer := bufio.NewWriter(file)
//将数据先写入缓存,并不会到文件中
writer.WriteString("大浪淘沙\n")
// 必须flush将缓存中的内容写入文件
// writer.Flush()
}

func writeFile() {
str := "怒发冲冠,凭栏处、潇潇雨歇。"
err := ioutil.WriteFile("满江红", []byte(str), 0666)
if err != nil {
fmt.Println("write file failed, err:", err)
return
}
}

func main() {
file, err := os.OpenFile("满江红.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
fmt.Println("open file failed, err:", err)
return
}
defer file.Close()

// 写字节或者字符串
writeBytesOrStr(file)

// flush写
writeByBufio(file)

// 写文件
writeFile()
}
提示

0777:-rwxrwxrwx,创建了一个普通文件,所有人拥有所有的读、写、执行权限

提示

0666:-rw-rw-rw-,创建了一个普通文件,所有人拥有对该文件的读、写权限,但是都不可执行

提示

0644:-rw-r--r--,创建了一个普通文件,文件所有者对该文件有读写权限,用户组和其他人只有读权限,没有执行权限

(2)读写模式

读取一个文件每一行内容,并追加一行该行的字符个数

package main

import (
"bufio"
"fmt"
"io"
"os"
"strings"
)

func main() {
file, err := os.OpenFile("读写满江红", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
if err != nil {
fmt.Println("open file failed, err:", err)
return
}
defer file.Close()

reader := bufio.NewReader(file)
writer := bufio.NewWriter(file)

for true {
// (1) 按行都字符串
strs, err := reader.ReadString('\n') // 读取到换行符为止,读取内容包括换行符
content := strings.Trim(strs, "\n")
s := fmt.Sprintf("\n该行长度为%d,内容为:%s", len([]rune(content)), content)

// (2) 将行数记录追加进入文件
writer.WriteString(s)
writer.Flush()

if err == io.EOF {
break
}
}
}