golang的文件读写操作
1.打开和关闭文件
os.Open()函数能够打开一个文件,返回一个*File和一个err。
对得到的文件实例调用close()方法能关闭文件。package main
import (
"fmt"
"os"
)
func main() {
file,err := os.Open("main.go")
if err != nil{
fmt.Println("open file failed!err:",err)
return
}
//为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句
file.Close()
}
结果:
open file failed!err: open main.go: no such file or directory
Process finished with exit code 02.读取文件
2.1file.Read()
main.go文件中的内容
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss基本使用
Read方法定义如下:
func (f *File) Read(b []byte) (n int, err error)
它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0和io.EOF。package main
import (
"fmt"
"io"
"os"
)
func main() {
file,err := os.Open("main.go")
if err != nil{
fmt.Println("open file failed!err:",err)
return
}
//为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句
defer file.Close()
var tmp = make([]byte,128)
n,err := file.Read(tmp)
if err == io.EOF{
fmt.Println("文件读完了")
return
}
if err != nil{
fmt.Println("read file failed,err:",err)
}
fmt.Printf("读取了%s字节数据\n",n)
fmt.Println(string(tmp[:n]))
}
结果:
读取了%!s(int=128)字节数据
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所
Process finished with exit code 0从上面可以看出,只能读取128字节的内容,并没有全部读取到。2.2循环读取
使用for循环读取文件中的所有数据。package main
import (
"fmt"
"io"
"os"
)
func main() {
file,err := os.Open("main.go")
if err != nil{
fmt.Println("open file failed!err:",err)
return
}
//为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句
defer file.Close()
//存储所有的数据
var content []byte
//存储每次读取的128字节数据
var tmp = make([]byte,128)
//循环读取文件
for{
n,err := file.Read(tmp)
if err == io.EOF{
fmt.Println("文件读完了")
break
}
if err != nil{
fmt.Println("read file failed,err:",err)
return
}
content = append(content,tmp[:n]...)
}
fmt.Println(string(content))
}
结果:
文件读完了
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
Process finished with exit code 02.3bufio读取文件
bufio是在file的基础上封装了一层API,支持更多的功能。package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 只读方式打开当前目录下的main.go文件
file, err := os.Open("./main.txt")
if err != nil {
fmt.Println("open file failed!, err:", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line,err := reader.ReadString('\n') //注意是字符
if err == io.EOF{
if len(line) != 0{
fmt.Println(line)
}
fmt.Println("文件读完了")
break
}
if err != nil{
fmt.Println("read file failed,err:",err)
return
}
fmt.Print(line)
}
}
结果:
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
文件读完了
Process finished with exit code 02.4ioutil读取整个文件
io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。package main
import (
"fmt"
"io/ioutil"
)
func main() {
content,err := ioutil.ReadFile("main.txt")
if err != nil{
fmt.Println("read file failed,err:",err)
return
}
fmt.Println(string(content))
}
结果:
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
少时诵诗书所所所所所所所所所
少时诵诗书所所所所所所所所所
main wenjain
少时诵诗书所所所所所所所所所
sssssss
Process finished with exit code 03.文件写入操作
os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
其中,
name:要打开的文件名。
flag:打开文件的模式。模式有以下几种。
perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。3.1Write和WriteString
package main
import (
"fmt"
"os"
)
func main() {
file,err := os.OpenFile("write.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666)
if err != nil{
fmt.Println("open file failed,err:",err)
return
}
defer file.Close()
str := "hello vita"
file.Write([]byte(str)) //写入字节切片数据
file.WriteString("hello lili") //直接写入字符串数据
}
write.txt中内容
hello vitahello lili3.2bufio.NewWriter
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file,err := os.OpenFile("write.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666)
if err != nil{
fmt.Println("open file failed,err:",err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for i:=0;i<10;i++{
writer.WriteString("hello 丽丽")
}
writer.Flush()
}
write.txt中内容
hello 丽丽hello 丽丽hello 丽丽hello 丽丽hello 丽丽hello 丽丽hello 丽丽hello 丽丽hello 丽丽hello 丽丽2.3ioutil.WriteFile
package main
import (
"fmt"
"io/ioutil"
)
func main() {
str := "hello lili"
err := ioutil.WriteFile("./write.txt", []byte(str), 0666)
if err != nil {
fmt.Println("write file failed, err:", err)
return
}
}
write.txt中内容
hello lili4.练习
4.1copyFile
借助io.Copy()实现一个拷贝文件函数。
src.txt中内容
src srcpackage main
import (
"fmt"
"io"
"os"
)
func CopyFile(dstName,srcName string)(written int64,err error) {
//以读方式打开源文件
src,err := os.Open(srcName)
if err != nil{
fmt.Printf("open %s failed,err:%v.\n",srcName,err)
return
}
defer src.Close()
//以写|创建的方式打开目标文件
dst,err := os.OpenFile(dstName,os.O_WRONLY|os.O_CREATE,0644)
if err != nil{
fmt.Printf("open %s failed,err:%v.\n",dstName,err)
return
}
defer dst.Close()
return io.Copy(dst,src)
}
func main() {
_,err := CopyFile("dst.txt","src.txt")
if err != nil{
fmt.Println("copy file failed,err:",err)
return
}
fmt.Println("copy done!")
}
结果:
copy done!
Process finished with exit code 0
dst中内容:
src src4.2实现一个cat命令
dst.txt中内容
dst
src.txt中内容
src
注意:由于只有一行内容,所以必须要有换行,否则不出现内容。可以尝试下哦~package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
func cat( r *bufio.Reader) {
for{
buf,err := r.ReadBytes('\n') //注意是字符,由于是读取换行符,所以文件中必须有换行
if err == io.EOF{
break
}
fmt.Fprintf(os.Stdout, "%s",buf)
}
}
func main() {
flag.Parse()//解析命令行参数
if flag.NArg() == 0{
//如果没有参数默认从标准输入读取内容
cat(bufio.NewReader(os.Stdin))
}
//依次读取每个指定文件的内容并打印到终端
for i:=0;i

创新互联建站专注于鼓楼企业网站建设,成都响应式网站建设,商城建设。鼓楼网站建设公司,为鼓楼等地区提供建站服务。全流程按需策划,专业设计,全程项目跟踪,创新互联建站专业和态度为您提供的服务
当前名称:golang的文件读写操作
本文链接:http://www.jxjierui.cn/article/pdcidh.html


咨询
建站咨询
