一. 基本案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package main

import (
"bufio" // 引入缓冲读写包
"fmt" // 引入格式化输出包
"io" // 引入基本的I/O操作包
"os" // 引入操作系统接口包
)

func main() {
// 读取文件案例演示区域
//test00()
fmt.Println("-----------------------------------")
//test01()
fmt.Println("-----------------------------------")
//test02()
fmt.Println("----------------写出文件-------------------")
//test03()
fmt.Println("-----------------------------------")
//test04()
//test05()
test06()
}

// 读取内容显示再写入追加内容
func test06() {
filepath := "d:/abc.txt"
file, err := os.OpenFile(filepath, os.O_RDWR, 0666) // 读写模式打开 权限为666在wins没有作用
if err != nil {
fmt.Println(err)
}
defer file.Close()
// 读取文件内容
reader := bufio.NewReader(file)
for {
readString, err := reader.ReadString('\n')
if err == io.EOF {
break
}
fmt.Print(readString)
}
// 写入内容
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString("我是djjjjjjjjjjjjjj~~~\n")
}
writer.Flush()
}

// 在原来的内容上追加内容
func test05() {
filepath := "d:/abc.txt" // 文件路径
file, err := os.OpenFile(filepath, os.O_WRONLY|os.O_APPEND, 666) // 打开指定路径的文件,以写入模式并追加到文件末尾,权限为666

defer file.Close() // 延迟关闭文件
if err != nil {
fmt.Println(err) // 打印错误信息
}
writer := bufio.NewWriter(file) // 创建写入器
for i := 0; i < 10; i++ {
writer.WriteString("我是灰灰灰~💴🔪999\n") // 写入字符串到写入器
}
writer.Flush() // 刷新写入器
}

// 清空文件并重新写入内容
func test04() {
filepath := "d:/abc.txt" // 文件路径
file, err := os.OpenFile(filepath, os.O_WRONLY|os.O_TRUNC, 666) // 以写入模式打开文件,并清空原有内容
defer file.Close() // 延迟关闭文件
if err != nil {
fmt.Println(err) // 打印错误信息
}
writer := bufio.NewWriter(file) // 创建写入器
for i := 0; i < 10; i++ {
writer.WriteString("我是渣渣灰~一🔪999\n") // 写入字符串到写入器
}
writer.Flush() // 刷新写入器
}

// 写出文件函数
// 此函数用于打开指定路径的文件并进行写入操作
func test03() {
filepath := "d:/abc.txt" // 设置文件路径
file, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0666) // 打开或创建文件,设置为写模式
defer file.Close() // 确保关闭文件资源
if err != nil {
fmt.Println(err)
}
// 创建带缓冲的写入器
writer := bufio.NewWriter(file)
str := "Hello coderyeah!\n"
for i := 0; i < 5; i++ {
writeString, _ := writer.WriteString(str) // 将字符串写入缓冲区,并返回写入字符个数
fmt.Println(writeString)
}
// 刷新缓冲区,确保数据真正写入到文件中
writer.Flush()
fmt.Println("写入完成")
}

// 适用于读取较小文件的函数
// 此函数一次性读取指定路径的整个文件内容
func test02() {
filePath := "d:/testgo.txt"
// 使用os.ReadFile替代ioutil.ReadFile一次性读取文件内容
str, err := os.ReadFile(filePath)
if err != nil {
fmt.Println(err)
}
// 输出读取到的文件内容
fmt.Print(string(str))
}

// 缓冲读取文件函数
// 此函数适用于读取较大的文件,通过逐行读取方式减少内存占用
func test01() {
file, err := os.Open("d:/testgo.txt") // 打开文件
if err != nil {
fmt.Println(err)
}
defer file.Close() // 关闭文件资源

// 创建一个缓冲读取器
reader := bufio.NewReader(file)

for {
// 读取一行数据直到遇到换行符
str, err := reader.ReadString('\n')
if err == io.EOF { // 如果读到文件末尾
fmt.Println(err)
break
}
fmt.Print(str) // 输出当前行的内容
}

fmt.Println("文件读取结束")
}

// 直接读取文件函数
// 此函数以块的形式读取文件内容
func test00() {
file, err := os.Open("d:/testgo.txt")
if err != nil {
fmt.Println(err)
}

fmt.Println(file) // 输出文件对象

var b []byte // 定义一个字节切片
b = make([]byte, 50) // 初始化切片大小为50

for {
// 从文件中读取数据到b切片
n, err := file.Read(b)
fmt.Println(n, string(b[:n])) // 输出读取的字节数和对应的字符串内容
if err != nil {
if err == io.EOF {
fmt.Println("EOF:", err) // 输出EOF信息
} else {
fmt.Println("err:", err) // 输出其他错误信息
}
break
}
}

// 使用匿名函数实现延迟关闭文件
defer func(file *os.File) {
err := file.Close()
if err != nil {
fmt.Println(err)
}
}(file)
}