使用go语言读取文件的各种方式整理。
一次性加载到内存中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// * 整个文件读到内存,适用于文件较小的情况
//每次读取固定字节
//问题容易出现乱码,因为中文和中文符号不占一个字符
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
}
|
一次性加载到内存中适用于小文件。 如果文件太大, 内存紧张的情况下, 可以借助缓冲, 分多次读取。
分块读取
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
|
// * 一块一块地读取, 即给一个缓冲, 分多次读到缓冲中
//按字节读取,将整个文件读取到缓冲区buffer
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
}
|
有时我们也需要按行处理
按行读
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// 逐行读取, 一行是一个[]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
}
|
使用ioutil读取文件的所有内容
1
2
3
4
5
6
7
8
|
func test1() {
bytes,err := ioutil.ReadFile( "filetoread.txt" )
if err != nil {
log .Fatal(err)
}
fmt.Println( "total bytes read:" ,len(bytes))
fmt.Println( "string read:" ,string(bytes))
}
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/skh2015java/article/details/78954293