Go_文件操作

文件操作

  • 文件在程序中是以流的形式来操作的
    在这里插入图片描述
  • os.File封装了所有文件相关的操作,File是一个结构体

常用的文件操作函数和方法

  • 打开文件:func Open(name string) (file *File, err error)
  • name:写文件的路径
  • 关闭文件:func (f *File) Close() error
  • 案例演示
package main
import(
	"fmt"
	"os"
)
/*
概念说明:file的叫法
1、file叫file对象
2、file叫file指针
3、file叫file文件句柄
*/
func main(){
	//打开文件
	file, err := os.Open("D:/学习之路/Go语言/test100.txt")
	if err != nil{
		fmt.Println("open file err=", err)
	}
	//输出文件内容,file就是一个 *File
	fmt.Printf("file=%v", file)

	//关闭文件
	err = file.Close()
	if err != nil{
		fmt.Println("close file err=", err)
	}

}
  • 读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open、file.Close、bufio.NewReader()、reader.ReadString函数和方法
package main
import(
	"fmt"
	"os"
	"io"
	"bufio"
)
/*
概念说明:file的叫法
1、file叫file对象
2、file叫file指针
3、file叫file文件句柄
*/
func main(){
	//打开文件
	file, err := os.Open("D:/学习之路/Go语言/test100.txt")
	if err != nil{
		fmt.Println("open file err=", err)
	}
	//输出文件内容,file就是一个 *File
	fmt.Printf("file=%v\n", file)

	//关闭文件
	defer file.Close()//要及时关闭file句柄,否则会有内存泄露
	//创建一个 *Reader ,带缓冲的
	/*
	const(
		defaultBufsize = 4096//默认缓冲区4096
	)
	*/

	reader := bufio.NewReader(file)
	//循环读取文件的内容
	for{
		str, err := reader.ReadString('\n')//读到一个换行就结束
		if err == io.EOF{//io.EOF表示文件的末尾
			break
		}
		//输出内容
		fmt.Print(str)
	}
	fmt.Println("文件读取结束...")

}
  • 读取文件内容并显示在终端(使用ioutil 一次将整个文件读入到内存中),适用于文件不大的情况
    • 方法和函数 ioutil.ReadFile(func ReadFile(filename string) ([]byte, error))
package main
import(
	"fmt"
	"io/ioutil"
)
/*
概念说明:file的叫法
1、file叫file对象
2、file叫file指针
3、file叫file文件句柄
*/
func main(){
	//因为没有显示的open文件,也不需要显示的close文件
	//因为文件的open和close被封装到ReadFile内部
	str, err := ioutil.ReadFile("D:/学习之路/Go语言/test100.txt")
	if err != nil{
		fmt.Println("open file err=", err)
	}
	//输出内容
	fmt.Printf("%v\n", str)//输出[]byte
	//要输出具体内容,需要转成string
	fmt.Printf("%v", string(str))
}
  • 写文件os.OpenFile():func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
    • name:文件名
    • flag :文件打开的模式
    • perm:权限控制(Linux\Unix下面有用)
      在这里插入图片描述
1、
package main
import(
	"fmt"
	"os"
	"bufio"
)
func main(){
	filepath := "D:/学习之路/Go语言/test200.txt"
	file, err := os.OpenFile(filepath, os.O_WRONLY | os.O_CREATE, 0666)
	if err!= nil{
		fmt.Printf("open file err=%v\n", err)
		return
	}
	//关闭文件
	defer file.Close()
	//准备写入的字串
	str := "hello, Gardon\n"
	writer := bufio.NewWriter(file)
	//写入时,使用带缓存的writer
	for i:=0; i<5;i++{
		writer.WriteString(str)
	}
	/*因为writer是带缓存的,因此在调用writerstring方法时,
	内容先写入到缓存中,所以需要调用Flush方法,
	将缓存的数据真正写入到文件中,否则文件中会没有数据*/
	writer.Flush()
}

2、

package main
import(
	"fmt"
	"os"
	"bufio"
)
func main(){
	filepath := "D:/学习之路/Go语言/test200.txt"
	file, err := os.OpenFile(filepath, os.O_WRONLY | os.O_TRUNC, 0666)
	if err!= nil{
		fmt.Printf("open file err=%v\n", err)
		return
	}
	//关闭文件
	defer file.Close()
	//准备写入的字串
	str := "hello, 中国\n"
	writer := bufio.NewWriter(file)
	//写入时,使用带缓存的writer
	for i:=0; i<10;i++{
		writer.WriteString(str)
	}
	/*因为writer是带缓存的,因此在调用writerstring方法时,
	内容先写入到缓存中,所以需要调用Flush方法,
	将缓存的数据真正写入到文件中,否则文件中会没有数据*/
	writer.Flush()
}

3、

package main
import(
	"fmt"
	"os"
	"bufio"
)
func main(){
	filepath := "D:/学习之路/Go语言/test100.txt"
	file, err := os.OpenFile(filepath, os.O_WRONLY | os.O_APPEND, 0666)
	if err!= nil{
		fmt.Printf("open file err=%v\n", err)
		return
	}
	//关闭文件
	defer file.Close()
	//准备写入的字串
	str := "hello, 中国\n"
	writer := bufio.NewWriter(file)
	//写入时,使用带缓存的writer
	for i:=0; i<3;i++{
		writer.WriteString(str)
	}
	/*因为writer是带缓存的,因此在调用writerstring方法时,
	内容先写入到缓存中,所以需要调用Flush方法,
	将缓存的数据真正写入到文件中,否则文件中会没有数据*/
	writer.Flush()
}


4、
package main
import(
	"fmt"
	"os"
	"bufio"
	"io"
)
func main(){
	filepath := "D:/学习之路/Go语言/test100.txt"
	file, err := os.OpenFile(filepath, os.O_RDWR | os.O_APPEND, 0666)
	if err!= nil{
		fmt.Printf("open file err=%v\n", err)
		return
	}
	//关闭文件
	defer file.Close()
	//先读取原来的文件内容,并显示在终端
	reader := bufio.NewReader(file)
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF{
			break
		}
		fmt.Print(str)
	}
	//准备写入的字串

	str := "\nhello, 北京"
	writer := bufio.NewWriter(file)
	//写入时,使用带缓存的writer
	for i:=0; i<5;i++{
		writer.WriteString(str)
	}
	/*因为writer是带缓存的,因此在调用writerstring方法时,
	内容先写入到缓存中,所以需要调用Flush方法,
	将缓存的数据真正写入到文件中,否则文件中会没有数据*/
	writer.Flush()
}

在这里插入图片描述

package main
import(
	"fmt"
	"io/ioutil"
)
//将文件test100中的内容导入到文件test200
/*将文件test100中的内容读取到内存
将读取到的内存追加到文件test200*/
func main(){
	filepath01 := "D:/学习之路/Go语言/test200.txt"
	filepath02 := "D:/学习之路/Go语言/test100.txt"
	count, err := ioutil.ReadFile(filepath01)
	if err != nil{
		fmt.Printf("read file01 err=%v\n", err)
		return
	}
	err = ioutil.WriteFile(filepath02, count, 0666)
	if err != nil{
		fmt.Printf("write file02 err=%v\n", err)
	}

}
  • 判断文件是否存在
  • path:文件路径;根据bool值,true表明文件存在,false表明文件不存在在这里插入图片描述
  • 拷贝文件
    在这里插入图片描述
package main
import (
	"fmt"
	"os"
	"bufio"
	"io"
)

func FileCopy(dstFileName string, srcFileName string) (written int64, err error){
	srcFile, err := os.Open(srcFileName)
	if err != nil{
		fmt.Println("open file err = %v\n", err)
	}
	defer srcFile.Close()
	reader := bufio.NewReader(srcFile)

	dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)
	if err != nil{
		fmt.Println("open file err = %v\n", err)
	}
	defer dstFile.Close()
	writer := bufio.NewWriter(dstFile)

	return io.Copy(writer, reader)
}
func main(){
	//将 D:/图片集/框图三.jpg 文件拷贝到 D:/学习之路/Go语言/abc.jpg
	srcFile := "D:/图片集/框图三.jpg"
	dstFile := "D:/学习之路/Go语言/abc.jpg"
	_, err := FileCopy(dstFile, srcFile)
	if err != nil{
		fmt.Printf("拷贝失败,err=%v\n", err)
	}else{
		fmt.Printf("拷贝成功")
	}
}
  • 统计英文、数字、空格和其他字符数量(统计一个文件中含有的英文、数字、空格及其他字符数量)
package main
import (
	"fmt"
	"io"
	"bufio"
	"os"
)
//定义一个结构体,用于保存统计结果
type CharCount struct{
	ChCount int  //记录英文个数
	NumCount int  //记录数字的个数
	SpaceCount int  //记录空格的个数
	OtherCount int  //记录其他的个数
}

//思路:打开一个文件,创建一个reader;
func main(){
	//声明结构体实例
	var count CharCount
	filename := "D:/学习之路/Go语言/test300.txt"
	file, err := os.Open(filename)
	if err != nil{
		fmt.Printf("open file err=%v\n", err)
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	//开始循环读取filename中的内容
	for{
		str, err := reader.ReadString('\n')
		if err == io.EOF{//读到文件末尾就退出
			break
		}
		//遍历str,为了兼容中文字符,可将str转成[]rune,即 str = []rune(str)
		for _, v := range str{
			switch{
			case v >= 'a' && v <= 'z':
				fallthrough   //穿透
			case v >= 'A' && v <= 'Z':
				count.ChCount++
			case v ==' ' || v =='\t':
				count.SpaceCount++
			case v >= '0' && v <='9':
				count.NumCount++
			default:
				count.OtherCount++
			}
		}
	}
	fmt.Printf("字符的个数为:%v,数字的个数为:%v,空格的个数为:%v,其他字符为:%v\n", count.ChCount, count.NumCount, count.SpaceCount,count.OtherCount)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值