Go 语言文件操作

文件操作

读取文件

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
	}
}

练习例子:修改文件内容

步骤:

  1. 打开文件(如果不存在则创建)。
  2. 读取文件内容。
  3. 修改文件内容。
  4. 将修改后的内容写回文件。
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
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值