文件操作
打开文件 os.Open()/os.OpenFile()
//打开文件只读文件,不会写入文件的情况用 os.open()
//如果涉及写入,用os.OpenFile()打开文件
fileobj,err := os.Open("./xxx.txt")
if err != nil{
fmt.Println("打开文件失败... ",err)
return
}
读取文件
单次读取文件 file.read()
- 测试读取的文件内容 (包括换行符共7字节)
abc
xyz
- 单次读取数据量比较小的文件读取
package main
import (
"fmt"
"os"
)
func readFromFile(){
//打开文件
//打开文件只读,不会写入的情况用 os.Open(),涉及写入用os.OpenFile()
fileObj,err := os.Open("./xxx.txt")
if err != nil{
fmt.Printf("打开文件失败... 错误信息:%v\n",err)
return
}
//读取文件
//创建 并 初始化 长度128字节的空切片,用来存放读取的数据
var tmp = make([]byte,128) //一次读128个字节
n,err := fileObj.Read(tmp) //返回n文件读出来多少个字节,err读取错误信息
if err != nil{
fmt.Printf("读取文件内容失败... 错误信息:%v\n",err)
return
}
fmt.Printf("读取%d字节数据\n",n)
fmt.Println(string(tmp))
//关闭文件,防止忘记关闭文件,用defer延迟关闭
defer fileObj.Close()
}
func main() {
readFromFile()
}
循环读取文件
- 文件内容
abc
xyz
var tmp = make([]byte,128)
var tmp = make([]byte,128)
var tmp = make([]byte,128)
var tmp = make([]byte,128)
var tmp = make([]byte,128)
a
b
c
d
e
f
g
- 循环读取
package main
import (
"fmt"
"io"
"os"
)
func readAll(){
//打开文件
//打开文件只读,不会写入的情况用 os.Open(),涉及写入用os.OpenFile()
fileObj,err := os.Open("./xxx.txt")
if err != nil{
fmt.Printf("打开文件失败... 错误信息:%v\n",err)
return
}
//关闭文件,防止忘记关闭文件,用defer延迟关闭
defer fileObj.Close()
//读取文件
var countN = 0 //统计读取总共字节数
for{
//创建 并 初始化 长度128字节的空切片,用来存放读取的数据
var tmp = make([]byte,128) //一次读128个字节
n,err := fileObj.Read(tmp) //返回n文件读出来多少个字节,err读取错误信息
if err == io.EOF{ //End Of File 代表 已经读到文件末尾,把当前读了多少个字节数据打印出来,然后退出
fmt.Println(string(tmp[:n])) //切片:从开始到字节数结尾
fmt.Printf("--------总共读取%d字节--------\n",countN)
return
}
if err != nil{
fmt.Printf("读取文件内容失败... 错误信息:%v\n",err)
return
}
fmt.Printf("读取%d字节数据\n",n)
countN += n
fmt.Println(string(tmp[:n])) //切片:从开始到字节数结尾
}
}
func main() {
readAll()
}
bufio 读取文件
bufio是在file的基础上封装了一层API,支持更多的功能。
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func readByBufio(){
//打开文件
//打开文件只读,不会写入的情况用 os.Open(),涉及写入用os.OpenFile()
fileObj,err := os.Open("./xxx.txt")
if err != nil{
fmt.Printf("打开文件失败... 错误信息:%v\n",err)
return
}
//关闭文件,防止忘记关闭文件,用defer延迟关闭
defer fileObj.Close()
//读取文件
reader := bufio.NewReader(fileObj)
for {
line,err := reader.ReadString('\n') //按照换行符\n读,返回的line就是string
if err == io.EOF {
if len(line) != 0 {
fmt.Println(line)
}
return
}
if err != nil {
fmt.Printf("读取文件失败,错误信息:%v\n",err)
return
}
fmt.Print(line) //line是根据上面'\n'风格的单行内容
}
}
func main() {
readByBufio()
}
ioutil 读取整个文件
io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。- 不要用 ioutil 读取太大的文件,容易撑爆内存
package main
import (
"fmt"
"io/ioutil"
)
func readByIoutil() {
content,err := ioutil.ReadFile("xxx.txt") //返回content是字节byte类型
if err != nil {
fmt.Printf("打开文件失败,错误信息:%v\n",err)
return
}
fmt.Println(string(content)) //将content字节byte类型 转换 为string
}
func main() {
readByIoutil()
}
文件写入 os.OpenFile()
os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
(name string, flag int, perm FileMode) 这三个参数分别代表 :
name:要打开的文件名flag:打开文件的模式。- flag的模式有以下几种:
| 模式 | 含义 |
|---|---|
os.O_WRONLY |
只写 |
os.O_CREATE |
创建文件 |
os.O_RDONLY |
只读 |
os.O_RDWR |
读写 |
os.O_TRUNC |
清空 |
os.O_APPEND |
追加 |
perm:代表文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。
Write() 和 WriteString()
package main
import (
"fmt"
"os"
"time"
)
func write(){
//写入模式: os.O_CREATE|os.O_WRONLY|os.O_APPEND :创建,写入,追加
//权限 0644
fileObj,err := os.OpenFile("aaa.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
if err != nil {
fmt.Printf("打开文件失败,错误信息:%v\n",err)
return
}
defer fileObj.Close()
now_time := time.Now()
ret1 := string(now_time.Format("2006-01-02 03:04:05")) //时间类型转换str类型
fileObj.Write([]byte(ret1)) //write 接收字节类型数据,str类型转换byte类型
fileObj.WriteString("hello,alex") //WriteString 接收字符串数据
}
func main() {
write()
}
bufio.NewWriter
- 会先写入缓存,然后通过 .Flush(),让数据再写入磁盘
package main
import (
"bufio"
"fmt"
"os"
)
func writeByBufio(){
//写入模式: os.O_CREATE|os.O_WRONLY|os.O_APPEND :创建,写入,追加
//权限 0644
fileObj,err := os.OpenFile("xxx.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
if err != nil {
fmt.Printf("打开文件失败,错误信息:%v\n",err)
return
}
defer fileObj.Close()
//写入
writer := bufio.NewWriter(fileObj)
writer.WriteString("alex") //写入缓存中,还没落盘
writer.Flush() //从缓存写入磁盘
}
func main() {
writeByBufio()
}
ioutil.WriteFile
- 把字节类型数据直接写入文件
package main
import (
"fmt"
"io/ioutil"
)
func writeByIoutil(){
str := "asdawdaasczxcas我命由我不由天"
err := ioutil.WriteFile("xxx.txt",[]byte(str),0644)
if err != nil {
fmt.Printf("写入失败,错误信息为:%v\n",err)
return
}
}
func main() {
writeByIoutil()
}
浙公网安备 33010602011771号