1、创建一个新文件,并往里面写入5个 hello, Golang
准备
package os
func OpenFile(name string, flag int, perm FileMode) (file File, err error)
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是PathError。
// package os
// Constants
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
// 使用方式(组合模式)
os.O_WRONLY | os.O_CREATE
package bufio
func NewWriter(w io.Writer) Writer
NewWriter创建一个具有默认大小缓冲、写入w的Writer。
func (b Writer) *WriteString(s string) (int, error)
WriteString写入一个字符串。返回写入的字节数。如果返回值nn < len(s),还会返回一个错误说明原因。
代码实现
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 创建一个新文件,并往里面写入5个 hello, Golang
// 1、打开 d:/abc.txt
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("打开文件失败")
return
}
// 2、写入5个 hello, Golang , 使用带缓存的 *Write
str := "hello, Golang\n"
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
// 3、将内容写入磁盘文件
// 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
// 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
writer.Flush()
// 4、操作完后,及时关闭文件,防止内存泄漏
// 操作完后,及时关闭文件,防止内存泄漏
defer func() {
err = file.Close()
if err != nil {
fmt.Println("关闭文件错误")
}
}()
}
实现效果
2、打开一个存在的文件,将原来的内容,覆盖成新的内容: “你好,Golang!”
代码实现
在上个案例的基础上,只需要修改 os.OpenFile 的文件打开模式,再重新写入即可
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
// 打开一个存在的文件,将原来的内容,覆盖成新的内容: “你好,Golang!”
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 1、打开 d:/abc.txt
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0666)
if err != nil {
fmt.Println("打开文件失败")
return
}
// 2、写入5个 hello, Golang , 使用带缓存的 *Write
str := "你好,Golang!\n"
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString(str)
}
// 3、将内容写入磁盘文件
// 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
// 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
writer.Flush()
// 4、操作完后,及时关闭文件,防止内存泄漏
// 操作完后,及时关闭文件,防止内存泄漏
defer func() {
err = file.Close()
if err != nil {
fmt.Println("关闭文件错误")
}
}()
}
实现效果
3、打开已存在的文件,在原先内容的基础上,追加 “ABC, ENGLISH!”
代码实现
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
// 打开已存在的文件,在原先内容的基础上,追加 “ABC, ENGLISH!”
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 1、打开 d:/abc.txt
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
fmt.Println("打开文件失败")
return
}
// 2、写入5个 hello, Golang , 使用带缓存的 *Write
str := "ABC, ENGLISH!\r\n"
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString(str)
}
// 3、将内容写入磁盘文件
// 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
// 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
writer.Flush()
// 4、操作完后,及时关闭文件,防止内存泄漏
// 操作完后,及时关闭文件,防止内存泄漏
defer func() {
err = file.Close()
if err != nil {
fmt.Println("关闭文件错误")
}
}()
}
实现效果
4、打开已存在的文件,把内容显示到终端,并追加内容 “hello, beijing”
代码实现
// 打开已存在的文件,把内容显示到终端,并追加内容 “hello, beijing”
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 1、打开 d:/abc.txt
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
if err != nil {
fmt.Println("打开文件失败")
return
}
// 2、读取内容,并显示在终端
reader := bufio.NewReader(file)
for {
// 读到一个换行就结束
str, err := reader.ReadString('\n')
if err == io.EOF {
// 读到一行末尾
break
}
// 输出内容
fmt.Print(str)
}
// 3、写入5个 hello, Golang , 使用带缓存的 *Write
str := "hello, beijing!\r\n"
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString(str)
}
// 4、将内容写入磁盘文件
// 因为 writer 是带缓存的,因此在调用 WriteString() 时,其实内容是先写入到缓存了,
// 因此需要再 Flush 一下,将缓存的数据真正写到文件中,否则文件中会没有数据
writer.Flush()
// 5、操作完后,及时关闭文件,防止内存泄漏
defer func() {
err = file.Close()
if err != nil {
fmt.Println("关闭文件错误")
}
}()
}