Go 文件操作(上)
打开文件和关闭文件
- 打开:os.Open()
- 关闭:fileObj.Close()
func f1(){
filObj, err := os.Open("./main.go")
if err != nil{
fmt.Printf("open file failed,err:%V",err)
return
}
defer fileObj.Close()
}
读文件
方法一:file.Read()
fileObj.Read([]byte)(n int, err error)
//返回数据:
//n:当次读取读了多少字节的数据
//err: 错误信息
完整示例代码:
package main //定义main包
// 导入相关包
import (
"fmt"
"os"
)
// 读写文件的操作
func f1() {
//用file.Read()来实现读文件
path := "./main.go" //文件路
file, err := os.Open(path) // 打开文件
if err != nil { //判断打开文件有没有出错
fmt.Println("文件打开出错,err:", err)
return
}
//函数结束时关闭文件句柄.用defer语句是为了怕代码过长,当对文件操作进行完时忘记关闭文件.养成打开与关闭联动的习惯
defer file.Close()
content := make([]byte, 128) //定义一个128长度的byte类型的切片
for {
n, err := file.Read(content) //读取文件
if err != nil { //判断读取文件有没有出错
fmt.Println("文件读取出错,err:", err)
return
}
fmt.Printf("读取了%d个字节\n", n)
fmt.Println(string(content[:n]))
if n < 128 {
// 判断文件有没有读取完.这样写,还是有小概率会出错.就是上一次刚好读取完了所有的数据,文件已经EOF了
// 可以在每次读取完成判断err == io.EOF, 如果是,说明已经读完了
return
}
}
}
// 主函数
func main() {
// 调用第一种读文件的方法
f1()
}
方法二bufio包
包: bufio
先创建一个读取器br := bufio(file)
再用读取器读取文件内容,按行读取
content, err := br.ReadString('\n') //注意参数是'\n
完整示例
package main //定义main包
// 导入相关包
import (
"fmt"
"os"
"bufio"
)
// bufio
func f2(){
//用file.Read()来实现读文件
path := "./main.go" //文件路
file, err := os.Open(path) // 打开文件
if err != nil { //判断打开文件有没有出错
fmt.Println("文件打开出错,err:", err)
return
}
//函数结束时关闭文件句柄.用defer语句是为了怕代码过长,当对文件操作进行完时忘记关闭文件.养成打开与关闭联动的习惯
defer file.Close()
br := bufio.NewReader(file)
for {
content, err := br.ReadString('\n') // 按行读取文件内容
if err != nil{
fmt.Printf("文件读取出错,err:%v",err)
return
}
fmt.Print(content)
}
}
// 主函数
func main() {
// 调用第一种读文件的方法
f2()
}
方法三:ioutil
ioutil.ReadFile(filepath)(b []byte, err error)
用此方法读取的文件内容:
- 是byte的切片
- 全文件读取
- 如果是纯文本文件的.
案例代码
func f3() {
b, err := ioutil.ReadFile("./main.go")
if err != nil {
fmt.Print(err)
}
fmt.Println(b)
str := string(b)
fmt.Println(str)
}
// 主函数
func main() {
// 调用第一种读文件的方法
f3()
a, err := fmt.Scanln()
fmt.Println(a, err)
}
后记:
文件操作是我们经常要用到的.
有三种不同的操作方法.
需要根据不同的需求,选择不同的方法