golang 读取文件

使用go语言读取文件的各种方式整理。

一次性加载到内存中

// * 整个文件读到内存,适用于文件较小的情况
func readAllIntoMemory(filename string) (content []byte, err error) {
	fp, err := os.Open(filename) // 获取文件指针
	if err != nil {
		return nil, err
	}
	defer fp.Close()

	fileInfo, err := fp.Stat()
	if err != nil {
		return nil, err
	}
	buffer := make([]byte, fileInfo.Size())
	_, err = fp.Read(buffer) // 文件内容读取到buffer中
	if err != nil {
		return nil, err
	}
	return buffer, nil
}

一次性加载到内存中适用于小文件。 如果文件太大, 内存紧张的情况下, 可以借助缓冲, 分多次读取。

分块读取

// * 一块一块地读取, 即给一个缓冲, 分多次读到缓冲中
func readByBlock(filename string) (content []byte, err error) {
	fp, err := os.Open(filename) // 获取文件指针
	if err != nil {
		return nil, err
	}
	defer fp.Close()

	const bufferSize = 64 // 缓冲大小, 每次读取64个字节

	buffer := make([]byte, bufferSize)
	for {
		// 注意这里要取bytesRead, 否则有问题
		bytesRead, err := fp.Read(buffer) // 文件内容读取到buffer中
		content = append(content, buffer[:bytesRead]...)
		if err != nil {
			if err == io.EOF {
				err = nil
				break
			} else {
				return nil, err
			}
		}
	}
	return
}

有时我们也需要按行处理

按行读

// 逐行读取, 一行是一个[]byte, 多行就是[][]byte
func readByLine(filename string) (lines [][]byte, err error) {
	fp, err := os.Open(filename) // 获取文件指针
	if err != nil {
		return nil, err
	}
	defer fp.Close()
	bufReader := bufio.NewReader(fp)

	for {
		line, _, err := bufReader.ReadLine() // 按行读
		if err != nil {
			if err == io.EOF {
				err = nil
				break
			}
		} else {
			lines = append(lines, line)
		}
	}

	return
}

 

 

在Go语言中,有多种读取文件的方法: 1. **使用`os.Open`和`io/ioutil.ReadAll`一次性读取整个文件**:Go语言的标准库提供了`os`和`io/ioutil`等包,可使用`os.Open`打开文件,`io/ioutil.ReadAll`读取文件全部内容,示例代码如下: ```go package main import ( "fmt" "io/ioutil" "os" ) func main() { file, err := os.Open("your_file.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() data, err := ioutil.ReadAll(file) if err != nil { fmt.Println("Error reading file:", err) return } fmt.Println(string(data)) } ``` 这种方法适合读取较小的文件,能简单直接地获取文件全部内容[^1]。 2. **使用`os`包的相关方法**:操作文件的相关方法在`$GOROOT/src/os/file.go`文件中,主要函数有`OpenFile()`、`Open()`、`ReadFile()`等。 - `OpenFile()`:是较底层的打开文件方式,可灵活配置打开的文件,例如`Create()`方法就是调用该方法实现文件的新建。 - `Open()`:以只读的方式打开一个文件。 - `ReadFile()`:调用`Open()`方法打开文件,循环读取文件内容,返回值是字节数组。示例代码如下: ```go package main import ( "fmt" "os" ) func main() { data, err := os.ReadFile("your_file.txt") if err != nil { fmt.Println("Error reading file:", err) return } fmt.Println(string(data)) } ``` 这里使用`os.ReadFile`直接读取文件内容,若文件不存在会返回错误[^2]。 3. **分块读取文件**:一次性读取整个文件有时不利于内存管理,Golang 提供了分块读取文件的方法,而非整个或逐行读取,避免因一行大小太大导致逐行读取低效。示例代码如下: ```go package main import ( "bufio" "fmt" "io" "log" "os" ) func main() { f, err := os.Open("ilovego.txt") if err != nil { log.Fatal(err) } defer f.Close() reader := bufio.NewReader(f) buf := make([]byte, 16) for { // reading a file upto buffer n, err := reader.Read(buf) if err != nil { if err != io.EOF { log.Fatal(err) } break } fmt.Print(string(buf[0:n])) } fmt.Println() } ``` 该示例中使用`bufio.NewReader`创建一个带缓冲的读取器,每次读取 16 字节的数据,直到文件结束[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值