概述
十、文件流
10.1、读取文件
10.1.1、打开文件/关闭文件
os.Open()函数能够打开一文件,返回一个 ***File** 和一个**err**,对得到的文件实例调用close()方法能够关闭文件。
10.1.1、file.Read()
func (f *File) Read(b []byte) (n int, err error)
const A = 256
func main() {
open, err := os.Open("./09接口.go")
if err != nil {
fmt.Println("未找到文件:", err)
}
defer open.Close()
var bytes [**A**]byte
for {
n, err := open.Read(bytes[:])
if err == io.EOF {
fmt.Println("读取完毕:", err)
return
}
if err != nil {
fmt.Println("读取失败:", err)
return
}
fmt.Println("读取了", n, "个字节")
fmt.Println(string(bytes[:]))
if n < **A** {
return
}
}
}
10.1.2、bufio
func main() {
open, err := os.Open("./09接口.go")
if err != nil {
fmt.Println("未找到文件:", err)
}
defer open.Close()
reader := bufio.NewReader(open)
for {
readString, err := reader.ReadString('n') //字符
if err == io.EOF {
fmt.Println("读取完毕:", err)
return
}
if err != nil {
fmt.Println("读取失败:", err)
return
}
fmt.Print(readString)
}
}
10.1.3、ioutil读取整个文件
func main() {
file, err := ioutil.ReadFile("./09接口.go")
if err != nil {
fmt.Println("读取失败:", err)
return
}
fmt.Println(string(file))
}
10.2、文件写入
10.2.1、os.OpenFile()
os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
}
● name:要打开的文件名
● flag :打开文件的模式。模式有以下几种:
● perm:文件权限,一个八进制数。r (读) 04,w (写) 02,x (执行) 01。
10.2.2、write()与writeString()
file, err := os.OpenFile("file.txt", os.**O_CREATE**|os.**O_APPEND**|os.**O_WRONLY**,0666)
if err != nil {
fmt.Println("打开错误:",err)
return
}
defer file.Close()
str := "hello 世界"
file.Write([]byte(str))
file.WriteString("hello 你好")
10.2.3、bufio.NewWriter
func main() {
file, err := os.OpenFile("file.txt", os.**O_CREATE**|os.**O_TRUNC**|os.**O_WRONLY**,0666)
if err != nil {
fmt.Println("打开错误:",err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
str := "hello 世界"
writer.WriteString(str)
writer.Flush()
}
10.2.4、ioutil.WriteFile
func main() {
str := "hello 世界a"
err := ioutil.WriteFile("file.txt",[]byte(str),0666)
if err != nil {
fmt.Println("打开错误:",err)
return
}
}
10.3、使用bufio获取用户输入
bufio.NewReader的参数就是接口与类型
func main() {
var s string
reader := bufio.NewReader(os.Stdin)
s, _ = reader.ReadString('n')
fmt.Println("输入的是:",s)
}
10.4、在文件中插入内容
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
Seek设置下一次读/写的位置。
offset为相对偏移量。
whence决定相对位置: 0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
10.4.1、指定位置读取
func main() {
file, err := os.OpenFile("./file.txt", os.**O_RDWR**, 0644)
if err != nil {
fmt.Println("文件打开失败:",err)
return
}
defer file.Close()
file.Seek(1,0)//光标移动
var ret [1]byte//
n, err := file.Read(ret[:])//读一个字节
if err != nil {
fmt.Println("文件读取失败:",err)
return
}
fmt.Println(string(ret[:n]))
}
10.4.2、指定位置写入(替换)
func main() {
file, err := os.OpenFile("./file.txt", os.**O_RDWR**, 0644)
if err != nil {
fmt.Println("文件打开失败:", err)
return
}
defer file.Close()
file.Seek(1, 0) //光标移动
ret := []byte{'5'}
_, err = file.Write(ret[:])//写入
if err != nil {
fmt.Println("写入文件失败:", err)
return
}
}
写入前:
写入后:
注意:写入指定位置,会替换此位置原来的内容,没有办法在文件按中间插入内容。
10.4.3、指定位置追加
追加思路:
借助临时文件:新建一个文件,把追加之前的写进去,在写追加的内容,然后把追加之后的写进去。(个人建议直接把所有内容写好重新覆盖,比较简单)
10.5、练习
10.5.1、复制文件
func copyFile(dstName, srcName string) (written int64, err error) {
srcFile, err := os.Open(srcName)
if err != nil {
fmt.Println("文件打开失败:", err)
return 1, err
}
defer srcFile.Close()
dstfile, err := os.OpenFile(dstName, os.**O_CREATE**|os.**O_TRUNC**|os.**O_WRONLY**, 0644)
if err != nil {
return 2, err
}
defer dstfile.Close()
return io.Copy(dstfile, srcFile)
}
func main() {
mode, err := copyFile("dis.txt", "file.txt")
if err != nil {
fmt.Println("文件复制失败:", err)
}
if mode == 1 {
fmt.Println("失败原因:资源文件打开失败")
} else if mode == 2 {
fmt.Println("失败原因:复制的新文件创建失败")
}
}
最后
以上就是秀丽鱼为你收集整理的Go语言基础(10)-- 文件流十、文件流的全部内容,希望文章能够帮你解决Go语言基础(10)-- 文件流十、文件流所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复