文件操作
读取文件
1.一次一次读取
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("filePath")
if err != nil {
fmt.Println("open file err = ", err)
}
defer file.Close()
reader := bufio.NewReader(file)
// 打印文件
for {
str, err := reader.ReadString('\n')
fmt.Print(str)
// 表示文件的末尾
if err == io.EOF {
break
}
}
}
2.一次性读取
使用 ioutil.ReadFile 一次将整个文件读入到内存中,适用于文件比较小的情况。
package main
import (
"fmt"
"io/ioutil"
)
// 一次性的读取(适用于文件不大)
func main() {
filePath := "filePath"
content, err := ioutil.ReadFile(filePath)
if err != nil {
fmt.Println("read file err = ", err)
}
fmt.Printf("%v\n", string(content))
}
写入文件
func Open(name string) (*File, error)
该函数以读取模式打开文件。以只读的方式访问,无法进行写入操作。如果你尝试执行写入操作(如 file.WriteString),会返回一个错误,因为文件没有写入权限。
注意:用这个方法打开文件,只能读内容,不能写入内容。
func OpenFile(name string, flag int, perm FileMode) (*File, error):
该函数用于打开文件并允许你指定访问模式。
name 参数
表示要打开或创建的文件的路径和名称。可以是相对路径或绝对路径。
flag 参数
指定文件打开的模式或操作类型。这个整数值是使用 os
包中的常量组合而成的,多个模式可以使用 "|" 组合。
os.O_RDWR 表示以读写模式打开文件,这样你就可以在文件上执行读和写操作;
perm 参数
指定新创建文件的权限模式(如果该文件已经存在那么这个文件权限不会起作用,只有在创建文件的时候才起作用)。
例子:0755
权限值 0755 是一个八进制数,每一位的含义如下:
- 最前面的 0 表示这是一个八进制数。
- 接下来的三位数字表示文件所有者、文件所属组和其他用户的权限。
每一位数字由三位二进制数表示,分别代表读、写和执行权限。这些权限的具体数值如下:
- 读 (r) = 4
- 写 (w) = 2
- 执行 (x) = 1
结合起来,权限值 0755 的分解:
- 第一位:7 (所有者权限):读 (r) = 4,写 (w) = 2,执行 (x) = 1,合计 = 4 + 2 + 1 = 7,7(即 111 二进制) 表示读、写、执行权限都有;
- 第二位:5 (所属组权限):读 (r) = 4,写 (w) = 0,执行 (x) = 1,合计 = 4 + 0 + 1 = 5,5 (即 101 二进制) 表示读和执行权限;
- 第三位:5 (其他用户权限):读 (r) = 4,写 (w) = 0,执行 (x) = 1,合计 = 4 + 0 + 1 = 5,5 (即 101 二进制) 表示读和执行权限。
1.一次一次写入(缓冲区)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
filePath := "filePath"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("open file err = ", err)
return
}
defer file.Close()
// 要写入的内容
str := "hello world\n"
// 写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
// 将缓冲区中的数据写入其基础写入器(io.Writer)
writer.Flush()
}
2.一次性写入
package main
import (
"fmt"
"io/ioutil"
)
func main() {
content := "hello world\n"
// 一次性写文件,没有缓冲区
targetFilePath := "filePath"
err := ioutil.WriteFile(targetFilePath, []byte(content), 0666)
if err != nil {
fmt.Println("写入文件失败, err = ", err)
return
}
}
练习例子:修改文件内容
步骤:
- 打开文件(如果不存在则创建)。
- 读取文件内容。
- 修改文件内容。
- 将修改后的内容写回文件。
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
filePath := "filePath"
// 1.打开文件,读写模式,如果文件不存在则创建
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// 2.一次性读取文件的全部内容
content, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("Error reading file:", err)
return
}
// 将文件内容转换为字符串
strContent := string(content)
fmt.Println("Original Content:\n", strContent)
// 3.修改内容
newContent := strContent + "\nNew line added."
// 4.将修改后的内容一次性写回文件
err = ioutil.WriteFile(filePath, []byte(newContent), 0644)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
}