一.文件基本介绍
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
二.常用的文件操作函数和方法
1.打开一个文件进行读操作
os.Open(name string) (*File,erroe)
2.关闭一个文件
file.Close()
二.读文件操作应用实例
1.读取文件的内容并显示在终端(带缓冲区的方式),
使用os.Open,file.Close,bufio.NewReader(),reader.ReadString函数和方法
2.读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况,相关方法和函数(ioutil.ReadFile)
三.写文件操作应用实例
基本介绍
说明:os.OpenFile是一个更一般性的文件打开函数,它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError
第二个参数:文件打开模式(可以组合):
基本应用实例-方式一
使用os.OpenFile(),bufio.NewWriter(),*Writer的方法*WriterString
1.创建一个文件输入5句hello world
2.打开一个存在的文件,将原来的内容覆盖成新的内容
3.打开一个存在的文件,在原来的内容上追加内容
4.打开一个存在的文件,将原来的内容读出显示在终端,并且追加几句语句
编写一个程序,将一个文件的内容,写入到另外一个文件。
四.判断文件是否存在
golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断:
1.如果返回的错误为nil,说明文件或文件夹存在
2.如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或者文件夹不存在
3.如果返回的错误为其他类型,则不确定是否存在
将一张图片/电影/MP3拷贝到另外一个目录下 e:/abc.jpg io包
func Copy(dst Writer,src Reader)(written int64, err error)
package main
import (
"bufio"
"fmt"
"io"
"os"
)
// 接收两个文件路径 srcFileName dstFilename
func CopyFile(dstFilename string, srcFileName string) (written int64, err error) {
srcFile, err := os.Open(srcFileName)
if err != nil {
fmt.Printf("open file err=%v\n", err)
}
defer srcFile.Close()
//通过srcfile,获取到Reader
reader := bufio.NewReader(srcFile)
//打开disFileName
dstFile, err := os.OpenFile(dstFilename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Printf("open file err=%v\n", err)
return
}
//通过dstFile,获取到writer
writer := bufio.NewWriter(dstFile)
return io.Copy(writer, reader)
}
func main() {
//将d:1.jpg 文件拷贝到e:/2.jpg
//1.调用函数完成文件拷贝
srcFile := "d:/1.jpg"
dstFile := "d:/2.jpg"
_, err := CopyFile(dstFile, srcFile)
if err == nil {
fmt.Println("拷贝完成")
} else {
fmt.Println("拷贝错误")
}
}
统计英文、数字、空格和其它字符数量
package main
import (
"bufio"
"fmt"
"io"
"os"
)
// 定义一个结构体,用于保存统计结果
type CharCount struct {
Ch int
Num int
Space int
Other int
}
func main() {
//打开一个文件,创建一个Reader
//每读取一行,就去统计
//将结果保存到结构体中
fileName := "d:/abc.txt"
file, err := os.Open(fileName)
if err != nil {
fmt.Printf("open file err=%v\n", err)
return
}
defer file.Close()
//定义一个CharCount实例
var count CharCount
//创建一个Reader
reader := bufio.NewReader(file)
//开始循环的读取fileName的内容
for {
str, err := reader.ReadString('\n')
if err == io.EOF {
break
}
//遍历str ,进行统计
for _, v := range str {
switch {
case v >= 'a' && v <= 'z':
fallthrough // 穿透
case v >= 'A' && v <= 'Z':
count.Ch++
case v == ' ' || v == '\t':
count.Space++
case v >= '0' && v <= '9':
count.Num++
default:
count.Other++
}
}
}
fmt.Printf("字符的个数=%v 数字的个数=%v 空格的个数=%v 其它字符个数=%v",
count.Ch, count.Num, count.Space, count.Other)
}