读取文件
通过Read方法读取
import (
"fmt"
"os"
)
func main() {
/*
打开文件
*/
// 以只读的方式打开文件,返回一个文件指针类型的对象和error
file, err := os.Open("./test.txt")
// 文件打开操作完之后必须关闭文件流,可以使用defer 延迟关闭
defer file.Close()
// err 非nil,说明有错误
if err != nil {
fmt.Println(err)
return
}
fmt.Println(file) // &{0xc00006a180}
/*
读取文件
*/
// 通过Read方法读取
// Read参数是一个字节切片,该切片用于接收读取文件的字节
// 定义接收读取到的文件字节的切片
var tempSlice = make([]byte, 128) // 128容量表示每次读取多少字节
// 有容量的切片接收字节,可能无法接收全部内容,再定义一个切片,通过循环存储每次读取的内容
var strSlice []byte
for {
// 返回两个参数,第一个是读取到的字节数量,第二个是error
n, err := file.Read(tempSlice)
// 由于是一个死循环,当文件读取完毕没有内容读取了,会抛出一个io.EOF错误
if err == io.EOF {
fmt.Println("读取完毕")
break
}
if err != nil {
fmt.Println("读取失败")
return
}
fmt.Printf("读取到了%v字节\n", n)
// 把每次读取到的内容追加到strSlice中,每次读取128个字节,可能最后的时候不够128字节,会出现空字节的问题
// n是每次读取到的字节数,通过[:n]切片获取每次读取成功的字节追加
strSlice = append(strSlice, tempSlice[:n]...)
}
fmt.Println(string(tempSlice)) // 读取到的文件内容,通过string把字节切片转换成文本
通过bufio读取文件
bufio 是在 file 的基础上封装了一层 API,支持更多的功能
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
/*
打开文件
*/
// 以只读的方式打开文件,返回一个文件指针类型的对象和error
file, err := os.Open("./test.txt")
// 文件打开操作完之后必须关闭文件流,可以使用defer 延迟关闭
defer file.Close()
// err 非nil,说明有错误
if err != nil {
fmt.Println(err)
return
}
// 创建读取对象
reader := bufio.NewReader(file)
// 通过for循环读取全部内容
var allStr string
for {
// 通过reader.ReadString读取文件,参数是一个字节类型的分割符,\n表示每次读取一行
// 返回的是读取到的字符串和err
str, err := reader.ReadString('\n')
if err == io.EOF {
// 标记结束后,可能最后还会有返回值没有拼接上,所以再结束时再拼接一次,,Read不会有该问题
allStr += str
fmt.Println("读取完毕")
break
}
if err != nil {
fmt.Println(err)
return
}
allStr += str
}
fmt.Println(allStr)
}
ioutil读取全部文件
// Go 1.16 开始会废弃 io/ioutil 包
import (
"fmt"
"io/ioutil"
)
func main() {
// 读取整个文件,一行一行读取
// 返回一个字节切片和err
byteStr, err := ioutil.ReadFile("./test.txt")
if err != nil {
return
}
fmt.Println(string(byteStr))
}
io.ReadAll读取全部文件
ioutil新版本已废弃,可以使用io.ReadAll代替
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("./test.txt")
defer file.Close()
byteStr, err := io.ReadAll(file)
if err != nil {
return
}
fmt.Println(string(byteStr))
}
写入文件
指定模式打开文件
os.Open()以只读的模式打开文件,无法写入文件,可以使用os.OpenFile()以指定模式打开文件
os.OpenFile()接收三个参数:
-
Name:文件名
-
falg:打开文件的模式
-
os.O_WRONLY 只写
-
os.O_CREATE 创建文件
-
os.O_RDONLY 只读
-
os.O_RDWR 读写
-
os.O_TRUNC 清空
-
os.O_APPEND 追加
-
-
perm:文件权限,一个八进制数。(读)04,(写)02,(执行)01,可以直接用0666、0766表示全部权限
func main() {
// 在./路径下创建test.txt文件、写入、每次打开文件清空之前内容
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
defer file.Close()
fmt.Println(file)
fmt.Println(err)
if err != nil {
return
}
Write 和 WriteString 写入文件
wtite写入字节类型的切片,WriteString写入字符串
import (
"fmt"
"os"
)
func main() {
// 每次在./路径下创建test.txt文件、写入模式、每次打开文件清空之前内容
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
defer file.Close()
if err != nil {
return
}
// 直接写入字符串,返回写入字节的数量和err
n, _ := file.WriteString("写入一行字符串\n")
fmt.Println(n)
// 写入byte切片的数据
strByte := []byte("写入一行byte数据")
n1, _ := file.Write(strByte)
fmt.Println(n1)
}
bufio写入文件
import (
"bufio"
"os"
)
func main() {
// 在./路径下创建test.txt文件、写入、每次打开文件清空之前内容
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
defer file.Close()
if err != nil {
return
}
// 创建writer对象
writer := bufio.NewWriter(file)
// 将数据写入缓存
writer.WriteString("写入一行数据")
// 将缓存的数据写入文件
writer.Flush()
}
通过ioutil写入文件
// Go 1.16 开始会废弃 io/ioutil 包
import "io/ioutil"
func main() {
str := "123123123"
ioutil.WriteFile("./test.txt", []byte(str), 0666)
}
os.WriteFile写入文件
io/ioutil 包写入文件的代替方案
func main() {
os.WriteFile("./test.txt", []byte("写入写入"), 0666)
}
文件复制
func main() {
// 读取文件内容
byteStr, e := os.ReadFile("./test.txt")
if e != nil {
return
}
// 读取到的内容写入到指定路径
e1 := os.WriteFile("./calc/test.txt", byteStr, 0666)
fmt.Println(e1)
}
/*
本质上就是读取文件内容写入一个新文件,也可以用其他方式循环读取文件流,追加循环写入新文件
*/
创建文件目录
func main() {
// 创建单级目录,返回一个err
os.Mkdir("./python", 0666)
// 创建多级目录,返回一个err,mac 0666会提示权限不足
os.MkdirAll("./Java/demo/01", 0766)
}
删除文件和目录
func main() {
// 删除文件
os.Remove("./test.txt")
// 删除目录,只能删除最底层的嵌套目录,不能删除上级目录
os.Remove("./Java/demo/01")
// 删除包含Java在内的以及Java层级下的所有文件和目录
os.RemoveAll("./Java")
}
文件重命名
import "os"
func main() {
os.Rename("./test.txt", "te.txt")
}
标签:文件,读取,err,fmt,golang,file,os,目录
From: https://www.cnblogs.com/Mickey-7/p/18033107