1.文件的打开,关闭
//1.打开文件
fp, err := os.Open("/Users/yangtao/go_lesson/test.txt")
if err != nil {
fmt.Println("打开失败")
}else {
fmt.Println("打开成功")
fmt.Println(fp)
}
//2.关闭文件
defer func() {
if err := fp.Close(); err != nil {
fmt.Println("关闭文件失败")
}else {
fmt.Println("文件关闭成功")
}
}()
//3.文件信息获取
finfo, err := os.Stat("/Users/yangtao/go_lesson/test.txt")
if err != nil {
fmt.Println(err)
}else{
//fmt.Println(finfo)
fmt.Println(finfo.Name())
fmt.Println(finfo.Size())
fmt.Println(finfo.ModTime())
fmt.Println(finfo.IsDir())
}复制代码
2.文件的读取操作
//4.读取文件第一种方式
buff := make([]byte,7)
for{
len, err := fp.Read(buff)
if len <= 0 || err != nil {
break;
}
fmt.Print(string(buff[:len]))
}
总结: 通过os包中的Read函数读取
func (f *File) Read(b []byte) (n int, err error)
Read函数会将读取到的数据放到指定的切片中, 并且会一次性将所有的数据都读取进来
会将读取到的byte个数返回给我们, 并且还会返回一个error,
如果读取成功, 那么error等于nil, 如果读取失败那么error就不等于nil
复制代码
r := bufio.NewReader(fp)
//第二种方式
str, err := r.ReadString('\n')
if(err != nil){
fmt.Println("读取失败")
}else{
fmt.Print(str)
}
//第三种方式
buff, err1 := r.ReadBytes('6')
if(err1 != nil){
fmt.Println("读取失败")
}else{
fmt.Println(string(buff))
}
总结: // 创建缓冲区
// 将打开的文件句柄传递给NewReader函数, 会返回一个新的句柄
// 缓冲区默认的大小是4096
// 利用缓冲区的句柄来读取数据
// 接收一个参数, 这个参数用于告诉ReadBytes函数, 读取到什么地方接收
// 会将读取到的数据放到一个切片中返回给我们
复制代码
//第四种方式
buf, err := ioutil.ReadFile("/Users/yangtao/go_lesson/test.txt")
if err != nil{
fmt.Println("读取失败")
}else{
fmt.Println(string(buf))
}
总结: 第四种读取的方式:
通过bufio包中的Read函数读取
// 会将指定路径中的文件一次性读取进来
// 接收一个参数: 用于传递需要读取的文件路径
// 返回两个值:
// 第一个返回值: 读取到的数据
// 第二个返回值: 读取失败就不等于nil复制代码
3.文件的写操作
//1.写入文件第一种方式
fp, err := os.Create("/Users/yangtao/go_lesson/test.txt")
if err != nil{
fmt.Println("打开文件失败")
return
}
// 2.关闭文件
defer func() {
if err = fp.Close(); err !=nil{
fmt.Println("关闭文件失败")
}
}()
buf := []byte{'l','n','j','\r','\n'}
len, err1 := fp.Write(buf)
if err1 !=nil{
fmt.Println("写入失败")
}else{
fmt.Println("写入成功, 写入了", len, "个字节")
}
总结:
注意点: Open函数打开的文件只能读取, 不能写入
fp, err := os.Open("D:/lnj.txt")
Create函数的作用: 创建一个文件
注意点: 文件不存在, 会自动创建一个新的
文件存在, 会覆盖以前的(相当于创建了一个新的替换掉了以前的旧的)复制代码
//1.写入文件第二种方式
fp, err := os.Create("/Users/yangtao/go_lesson/test.txt")
if err != nil{
fmt.Println("打开文件失败")
return
}
// 2.关闭文件
defer func() {
if err = fp.Close(); err !=nil{
fmt.Println("关闭文件失败")
}
}()
// 3.创建一个写入缓冲区
w :=bufio.NewWriter(fp)
//4.写入数据
len, err := w.WriteString("www.baidu.com\r\n")
if err != nil{
fmt.Println("写入失败")
}else{
fmt.Println("写入成功, 写入了", len, "个字节")
}
// 注意点:
// 如果通过带缓冲区的方式写入数据, 那么必须在写入完毕之后刷新一下缓冲区, 才会将缓冲区中的数据真正的写入到文件中
w.Flush()复制代码
/*
第三种写入的方式:
通过ioutil包中的Write和WirteString函数读取
*/
buf := []byte{'l','n','j','\r','\n'}
err := ioutil.WriteFile("/Users/yangtao/go_lesson/test.txt", buf, 0666)
if err != nil{
fmt.Println("写入数据失败")
}else{
fmt.Println("写入数据成功")
}复制代码
4.文件读写
func main() {
/*
os包中的Open函数只能读取不能写入
os包中的Create函数可以读取也可以写入, 但是每次执行都会覆盖原有的文件, 每次执行都是一个空文件
所以: 如果想要往文件中追加数据, 利用如上两个方法是不行的
所以: 需要通过os包中的另一个函数: OpenFile
作用: 打开一个文件, 并且文件不存在可以创建(注意是可以不是自动)
第一个参数: 需要打开文件的路径
第二个参数: 以什么模式打开文件 (只读/只写/可读可写/追加/)
模式可以同时指定多个, 多个之间使用|分隔, 例如 O_CREATE | O_WRONLY
第三个参数: 指定文件的权限, 只对Linux系统有效, 在Windows下无效
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
0.没有任何权限
1.执行权限(如果是可执行程序, 可以运行)
2.写权限
3.写权限和执行权限
4.读权限
5.读权限和执行权限
6.读权限和写权限
7.读权限和写权限以及执行权限
一般情况下写 0666
注意点: OpenFile和Open函数一样, 打开文件之后需要手动关闭文件
*/
fp, err := os.OpenFile("/Users/yangtao/go_lesson/test.txt", os.O_APPEND | os.O_RDWR, 0666)
if err != nil{
fmt.Println("创建失败")
}else{
fmt.Println(fp)
}
defer func() {
if err := fp.Close(); err != nil{
fmt.Println("关闭文件失败")
}
}()
//len, err := fp.WriteString("www.itzb.com")
//if err != nil{
// fmt.Println("写入数据失败")
//}else{
// fmt.Println("写入成功, 写入了", len, "个字节")
//}
//buf := make([]byte, 1024)
//_, err = fp.Read(buf)
//if err != nil{
// fmt.Println("读取数据失败")
//}else{
// fmt.Println(string(buf))
//}
w := bufio.NewWriter(fp)
len , err := w.WriteString("\r\n123456")
if err != nil{
fmt.Println("写入数据失败")
}else{
fmt.Println("写入成功, 写入了", len, "个字节")
}
w.Flush()
}复制代码
代码:https://github.com/codeXiaoQiang/Go-language