Fork me on GitHub

Golang之旅20-文件操作

文件操作的包是os,主要的方法是Create、Open、OpenFile、Read、ReadAt(定位读取)等

文件读取

  • read()
  • bufio读取,按照行读取
  • ioutil读取,快速

文件写入

  • write()
  • bufio
  • ioutil
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ioutil 读取和写入文件
package main

import (
"fmt"
"io/ioutil"
)

func main() {
// 读取整个文件
content, err := ioutil.ReadFile("file")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(content))

// 写入文件,参数:写入的文件名、写入的内容
err:= ioutil.WriteFile("test.txt", []byte("My Name is GoLang"), 0755)
if err != nil {
return
}
}

栗子

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
package main

import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)

// 文件操作

// 单次读取文件
func readFromFile(){
fileObj, err := os.Open("./test.txt") // 参数是文件路径
if err != nil{
fmt.Println("open the file,err:%v\n",err)
return
}

defer fileObj.Close() // 关闭文件
// 读取文件
var tmp = make([]byte, 128) // 读取字节数量128
n, err := fileObj.Read(tmp) // 读取文件用read
if err != nil{
fmt.Printf("read from file failed, err:%v\n", err)
return //返回的就是err
}
fmt.Printf("read %d bytes from file.\n", n) // 读取字节数
fmt.Println(string(tmp)) // tmp是字节,需要转成字符串格式
}

// 读取大文件,通过for循环实现
func readAll(){
fileObj, err := os.Open("./test.txt") // 文件路径
if err!= nil{
fmt.Println("open the file, err:%v\n",err)
return
}

defer fileObj.Close() // 关闭文件

// 循环读取
for {
var tmp = make([]byte, 64) // 每次读取128个字节
n, err := fileObj.Read(tmp)
// EOF: end of file ,读取到文件末尾打印出来
if err == io.EOF{
// 把当前读了多少个字节打印出来
fmt.Println(string(tmp[:n]))
return
}

if err != nil{
fmt.Println("read from file failed, err%v\n", err)
return
}
fmt.Printf("read %d bytes from file.\n", n)
fmt.Println(string(tmp[:n]))
}
}

// bufio 在file的基础上封装了一层API,支持更多的功能;一行行读取文件
func readByBufio(){
fileObj, err := os.Open("./test.txt")
if err != nil{
fmt.Println("open file failed, err:%v\n", err)
return
}
defer fileObj.Close()

reader := bufio.NewReader(fileObj) // 参数是文件,得到的是reader实例对象

// 循环读取
for{
line, err := reader.ReadString('\n') // 单引号:字符, 双引号:字符串
if err == io.EOF{
fmt.Print(line)
return
}
if err != nil{
fmt.Printf("read file by failed, err:%v\n",err)
return
}
fmt.Print(line)
}
}

// ioutil 快速读取大文件
func readByIoutil(){
content, err := ioutil.ReadFile("./test.txt")
if err != nil{
fmt.Printf("read bu ioutil failed, err:%v\n", err)
return
}
fmt.Println(string(content))
}


// write

// 文件写入操作 openfile
func write(){
fileObj, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) // 标志位 可以有多个
if err != nil{
fmt.Printf("open file failed,err:%v\n",err)
return
}

defer fileObj.Close()

str := "小明"
fileObj.Write([]byte(str)) // 写入字节byte
fileObj.WriteString("hello 沙河") // 写入字符串string
}

func writeByBufio(){
fileObj, err := os.OpenFile("testOne.txt",os.O_CREATE|os.O_APPEND|os.O_TRUNC,0644)
if err != nil{
fmt.Printf("open file failed,err:%v\n", err)
return
}
defer fileObj.Close()

writer := bufio.NewWriter(fileObj)
writer.WriteString("小明和小红") // 将内容写入缓冲区
writer.Flush() // 调用操作系统的接口,将缓冲区的内容写入磁盘中
}

func writeByIoutil(){
str := "我命由我不由天"
err := ioutil.WriteFile("testTwo.txt", []byte(str), 0644)
if err != nil{
fmt.Printf("write file failed,err:%v\n",err)
return
}
}

func main() {
readFromFile()
readAll()

// 不循环的话,只读取第一行
readByBufio()
readByIoutil()

write()
writeByBufio()
writeByIoutil()
}

本文标题:Golang之旅20-文件操作

发布时间:2019年10月09日 - 11:10

原始链接:http://www.renpeter.cn/2019/10/09/Golang%E4%B9%8B%E6%97%8520-%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea