读文件
func Exit(code int)
- 让当前程序以给出的状态码code退出。一般来说,状态码0表示成功,非0表示出错。
func Open(name string) (file *File, err error)
-
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。
-
-
例子。在GOPATH下的src里,建立一个test.txt
里边写下
hello
world
编写go代码。
编辑
buffio
func NewReader
NewReader创建一个具有默认大小缓冲、从r读取的*Reader。
func NewReader(rd io.Reader) *Reader
例子:按行读取
file, err := os.Open("./test.txt")
if err != nil {
os.Exit(1)
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err == io.EOF {
//不加这一句,最后一样如果不换行,会导致最后一行不输出
//如果最后一行换行,最后的line为空字符串,对于输出并不影响
fmt.Printf("%q,%t", line, (line == ""))
break
}
fmt.Print(line)
}
3.一次读取全部
os.ReadFile
b, err := os.ReadFile("./test.txt")
if err != nil {
panic(err)
}
fmt.Println(string(b))
io.ReadAll
该函数接收一个实现了io.Reader接口的参数r,并将从r中读取的所有数据返回为字节切片。返回的字节切片即为文件的完整内容,读取操作完成后,ReadAll函数会自动关闭r。
file, err := os.Open("./test_u8.txt")
if err != nil {
os.Exit(1)
}
defer file.Close()
content, err := io.ReadAll(file)
if err != nil {
panic(err)
}
fmt.Println(string(content))
写文件
1.OS模块
func OpenFile(name string, flag int, perm FileMode) (*File, error)
- flag:打开文件的模式
O_RDONLY:只读打开文件,用的较少,因为Open方法用的就是它。
O_WRONLY:只写
O_RDWR:读写
注意上面这三个,是互斥的,不可以同时使用。
O_APPEND:追加写入
O_CREATE:文件不存在则创建,存在就不管。
O_EXCL:文件存在则报错。配合O_CREATE使用,如果创建的文件已存在就报错。
O_SYNC:同步IO,等待上一次IO完成。
O_TRUNC:对于可写的文件,打开时清空内容。
- perm:文件权限
参考liunx文件权限。
0666。代表所有人都有可读写的权限。前边的0代表这个数字是使用8进制
0644。代表自己可读写,其他人只能读
例子。
编写go代码。
2.buffio
如果需要多次执行写入文件的操作,推荐使用 bufio 里的 Writer 结构体去操作,它会开辟一个缓冲区,默认大小为 4096 字节。在数据没有被刷入磁盘之前,所写入的数据都会暂时保存到缓冲区里。
NewWriter(w io.Writer) *Writer 开辟一个默认值为 4096 字节的缓冲区,用于暂存写入文件的数据内容,返回一个 Writer 结构体的指针变量
w 参数:类型为 Writer 接口,实现这个接口的数据类型变量都可以作为参数,例如 File。 返回值 *Writer:一个 Writer 结构体的指针变量,通过该变量可以往缓冲区里写入数据。
Writer.WriteString(s string) (int, error) 往缓冲区写入内容的方法。
参数 s 为写入的字符串。 第一个返回值为写入的字节数。 第二个返回值为写入数据的过程中产生的错误。
Writer.Flush() error 将所有的缓存数据写入磁盘。
返回值为数据写入磁盘的过程中产生的错误。
func main() {
file, err := os.OpenFile("./test.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
os.Exit(1)
}
defer file.Close()
buffWriter := bufio.NewWriter(file)
buffWriter.WriteString("你好世界!\n")
buffWriter.WriteString("你好,去!\n")
buffWriter.Flush()
}
3.一次写入所有内容
os.WriteFile
此函数为覆盖写入。如果文本存在,并且有内容,会情况文件。如果文件不存在,会创建该文件
例子
os.WriteFile("./test.txt", []byte("我可以一次性写入"), 0666)
io.WriteString
w Writer 对象。
s 要写入的文件内容。
返回值
n 写入的字节数。
err 如果操作成功,返回 nil **否则,返回错误信息。
例子:
file, err := os.OpenFile("./test.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
os.Exit(1)
}
defer file.Close()
io.WriteString(file, "Hello, world!\n")
4.以读写模式打开,在指定位置读写
f, err := os.OpenFile(./test.txt, os.O_RDWR, 0666) // 读写打开文件
if err != nil {
os.Exit(1)
}
defer f.Close()
end, err := f.Seek(0, io.SeekEnd)
if err != nil {
log.Fatal(err)
}
fmt.Println("end: ", end) // 移动到文件末尾。查看下偏移量
fs, err := f.Stat()
if err != nil {
log.Fatal(err)
}
fmt.Println("size: ", fs.Size()) // 根据文件状态属性查看文件大小
start, err := f.Seek(24, io.SeekStart) //从文件开头偏移24个位置
if err != nil {
log.Fatal(err)
}
fmt.Println("start: ", start)
_, err = f.WriteString("a") //覆盖写。把第25个位置的字符换成a
if err != nil {
log.Fatal(err)
}
var b = []byte{0}
f.Read(b) // 读取后边一个字节
fmt.Println("b: ", string(b)) // 输出b