当前位置:网站首页>go IO操作-文件读
go IO操作-文件读
2022-07-24 02:42:00 【go|Python】
文章目录
go IO操作-文件读
读文件介绍
文件读取是所有编程语言中最常见的操作之一。我们会学习如何使用 Go 读取文件。
Go语言读取文件通常有以下几种:
- 使用File自带的Read方法,使用
os.Open()或os.OpenFile()打开文件(Open本质还是调用了OpenFile) - 使用
bufio库的Read方法,使用bufio.NewReader(文件对象),也需要先打开文件 - 使用
io/ioutil库的ReadAll(),使用ioutil.ReadFile(文件路径),本质还是调用了os.OpenFile
速度比较:
bufio>ioutil.ReadAll> File自带Read
文件打开与关闭
使用os.Open打开
func main() {
file,err:=os.Open("./xx.txt") // 打开文件 OpenFile(name, O_RDONLY, 0)
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
fmt.Println(file) // 文件句柄
}
使用 os.OpenFile打开
func main() {
//flag:打开方式
//perm:打开权限
file,err:=os.OpenFile("./xx.txt",os.O_RDONLY,0) // 打开文件
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
fmt.Println(file) // 文件句柄
}
flag参数介绍
| 模式 | 含义 |
|---|---|
| os.O_WRONLY | 只写 |
| os.O_CREATE | 创建文件 |
| os.O_RDONLY | 只读 |
| os.O_RDWR | 读写 |
| os.O_TRUNC | 清空 |
| os.O_APPEND | 追加 |
扩展阅读文件权限-perm介绍
# 在linux终端里使用ll 可以查看文件权限操作权限
# 关于- rwx rwx rwx:
第一个 - :代表这是一个普通文件(regular), 其中其他文件类型还包括了
d--------->目录文件(directory)
l --------->链接文件(link)
b--------->块设备文件(block)
c--------->字符设备文件(character)
s--------->套接字文件(socket)
p--------->管道文件(pipe)
# 一共有三组rwx,分别是以下几种用户的rwx权限:
第一组:该文件拥有者的权限
第二组:该文件拥有者所在组的其他成员对该文件的操作权限
第三组:其他用户组的成员对该文件的操作权限
# r表示读权限,w表示写权限,x表示执行权限
# 值是使用八进制进行计算的;例如:-rwxrwxrwx(前面的-代表这是一个普通文件)文件权限,计算过程如下:
rwx rwx rwx
111 111 111
7 7 7
此时该文件的权限值为777
# 其他
777 代表
该文件拥有者对该文件拥有读写操作的权限
该文件拥有者所在组的其他成员对该文件拥有读写操作的权限
其他用户组的成员对该文件也拥有读写操作权限
666代表
该文件拥有者对该文件拥有读写的权限但是没有操作的权限
该文件拥有者所在组的其他成员对该文件拥有读写的权限但是没有操作的权限
其他用户组的成员对该文件也拥有读写权限但是没有操作的权限
# 所以
r(读)04,w(写)02,x(执行)01
普通读取文件(File.Read)
基本使用
Read方法定义如下:
func (f *File) Read(b []byte) (n int, err error)
它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0和io.EOF
func main() {
file,err:=os.OpenFile("./xx.txt",os.O_RDONLY,0) // 打开文件
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
fmt.Println(file) // 文件句柄
var buf []byte=make([]byte,1024)
// var buf []byte=make([]byte,8) // 假设文件就9个字节,使用8字节的切片读是读不全的
n,err:=file.Read(buf)
if err == io.EOF {
fmt.Println("文件读取完毕")
return
}
if err != nil {
fmt.Println("读取文件出错",err)
return
}
fmt.Printf("读了%d字节个数据,数据内容为:%s",n,string(buf[:n]))
}
循环全部读出
上面如果buf大小太小,文件可能读不完,所以我们要循环读出所有内容
func main() {
file,err:=os.OpenFile("./xx.txt",os.O_RDONLY,0) // 打开文件
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
fmt.Println(file) // 文件句柄
var buf []byte=make([]byte,5) // 存放每次读出的字节
var content []byte // 存放所有读出来的字节
for {
n,err:=file.Read(buf)
if err == io.EOF {
fmt.Println("文件读取完毕")
break
}
if err != nil {
fmt.Println("读取文件出错",err)
break
}
content=append(content,buf[:n]...) // 把每次读出的数据,追加到content中
}
fmt.Printf("数据内容为:%s",string(content))
}
ioutil 读取文件
io/ioutil包的ReadFile方法能够读取完整的文件,一次性读取文件所有数据
直接打开文件全部读取
func main() {
content,err:=ioutil.ReadFile("./xx.txt")
if err!=nil {
fmt.Println("读取文件出错:",err)
}
fmt.Println("文件内容为:",string(content))
}
传入打开的文件全部读取
或者传入一个io.Reader
func main() {
file,err:=os.Open("./xx.txt")
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
content,err:=ioutil.ReadAll(file) // 传入io.Reader
if err!=nil {
fmt.Println("读取文件出错:",err)
}
fmt.Println("文件内容为:",string(content))
}
bufio读取文件
bufio是在file的基础上封装了一层 API,支持更多的功能。
分块读取
func main() {
file,err:=os.Open("./xx.txt")
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
var buf =make([]byte,5)
reader:=bufio.NewReader(file)
for {
n,err:=reader.Read(buf)
if err == io.EOF {
fmt.Println("读完毕")
break
}
if err!=nil {
fmt.Println("读取出错:",err)
return
}
fmt.Println(string(buf[:n]))
}
}
按行读取
方式1
func main() {
file,err:=os.Open("./xx.txt")
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
reader:=bufio.NewReader(file)
for {
line,_,err:=reader.ReadLine()
if err == io.EOF {
break
}
fmt.Println(string(line))
}
}
方式二
func main() {
file,err:=os.Open("./xx.txt")
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
reader:=bufio.NewReader(file)
for {
line,err:=reader.ReadString('\n') // 按 \n 这个字符分隔读
if err == io.EOF {
if len(line)>0{
fmt.Println(line)
}
break
}
fmt.Println(string(line))
}
}
方式三
func main() {
file,err:=os.Open("./xx.txt")
if err != nil {
fmt.Println("打开文件出错:",err)
}
defer file.Close() // 关闭文件
s := bufio.NewScanner(file) // 创建一个NewScanner
for s.Scan() {
//返回true表示没读完
fmt.Println(s.Text()) // 把读出的内容,转成字符串
}
}
边栏推荐
- Fasterrcnn sample code test 1: make anchor_ generator = None
- [management / upgrade] * 02. View the upgrade path * FortiGate firewall
- 攻防世界WEB练习区(backup、cookie、disabled_button)
- Rylstim Screen Recorder
- Jina AI 联合Datawhale,发起学习项目!
- JDBC tool class
- “我们为什么要做 iVX ? ” ——访 iVX CEO 孟智平 了解 iVX 企业文化
- [diary of supplementary questions] [2022 Niuke summer school 1] i-chiitoitsu
- 关于 SAP 电商云 Spartacus UI Transfer State 冗余 API 请求发送的讨论
- Relational expression greater than > less than < congruence = = = Nan isnan() logical operator double sense exclamation point!! & |% +-- Short circuit calculation assignment expression shortcut operat
猜你喜欢

关于 SAP 电商云 Spartacus UI Transfer State 冗余 API 请求发送的讨论
[email protected]使用原理"/>(六)装饰器扩展之[email protected]使用原理

软考---程序设计语言基础(上)

理解加载class到JVM的时机

记于2022.7.21

Share an API Gateway project based on ABP and yarp

Analyze the space practice field required by maker education activities

22 -- range and of binary search tree

Reading notes: self cultivation of programmers - Chapter 3

老公,我们现在无家可归了
随机推荐
Numberoptional: a tool for converting strings to numbers
js传参时传入 string有数据;传入 number时没有数据;2[0]是对的!number类型数据可以取下标
Doodle icons - a free commercial graffiti style icon library, cute, light and unique
JpaRepository扩展接口
Some consulting questions and answers raised by friends who lack programming foundation and want to change careers in ABAP development post
Mysql database, query
Qt开发串口通讯软件中的数据转换问题:读取时_QByteArray转string;发送时_数据格式;int转16进制格式string;string中截取字符;16进制数加法;string转ByteAr
【补题日记】[2022牛客暑期多校1]D-Mocha and Railgun
C language actual combat guessing game
[diary of supplementary questions] [2022 Hangdian summer school 1] c-backpack
This article shows you how to use SQL to process weekly report data
Enter cnpm -v and cnpm appears: the file c:\users\19457\appdata\roaming\npm\cnpm.ps1 cannot be loaded because running scripts is prohibited on this system.
【补题日记】[2022牛客暑期多校1]C-Grab the Seat
Wechat applet realizes broken line area chart rose chart three-dimensional histogram
相关性(correlation)
X Actual combat - Cloud Server
SSM's technical forum includes front and back offices
Recorded on July 21, 2022
攻防世界WEB練習區(view_source、get_post、robots)
Causal learning open source project: from prediction to decision!