打开和关闭文件
/* 简易方式打开一个文件,拿着一顿骚操作,一秒后关闭. 以只读方式打开一个文件,创建其带缓冲的读取器,读取文件到末尾. 使用ioutil包对test.txt进行简易读取. 以创写追加或创写覆盖方法打开一个文件,缓冲式写出几行数据,倒干缓冲区后退出。 使用os包的状态检测结合,os.ISnotExist(err)判断文件师父存在. 使用ioutil包进行简易文件写出. */
简单打开一个文件
1 //简易方式打开一个文件,拿着一顿骚操作,一秒后关闭 2 package main 3 4 import ( 5 "fmt" 6 "os" 7 "time" 8 ) 9 10 func main() { 11 file, err := os.Open("C:/Go/test1.txt") 12 if err == nil { 13 fmt.Println("文件打开成功..") 14 } else { 15 fmt.Println("文件打开失败,失败内容是:", err) 16 return 17 } 18 19 //defer关闭文件 20 defer func() { 21 file.Close() 22 fmt.Println("文件已关闭..") 23 }() 24 25 //模拟文件操作 26 time.Sleep(1 * time.Second) 27 fmt.Println("文件是", file) 28 29 } 30 31 /* 32 文件打开成功.. 33 文件是 &{0xc00006a780} 34 文件已关闭.. 35 36 37 文件打开失败,失败内容是: open C:/Go/test1.txt: The system cannot find the file specified. 38 */
一行一行读取完整文件内容
1 //以只读方式打开一个文件,创建其带缓冲的读取器,读取文件到末尾. 2 package main 3 4 import ( 5 "bufio" 6 "fmt" 7 "io" 8 "os" 9 ) 10 11 func main() { 12 //以只读方式,并且文件权限以666访问. 13 file, err := os.OpenFile("C:/Go/test.txt", os.O_RDONLY, 0666) 14 if err == nil { 15 fmt.Println("文件打开成功") 16 } else { 17 fmt.Println("文件打开失败,err:", err) 18 return 19 } 20 21 defer func() { 22 file.Close() 23 fmt.Println("文件已关闭") 24 }() 25 26 //创建其带缓冲的读取器 27 reader := bufio.NewReader(file) 28 29 //整体循环读取整个文件. 30 for { 31 str, err := reader.ReadString(' ') //一行一行的读取 32 if err == nil { 33 fmt.Println(str) 34 } else { 35 36 //如果错误是已到文件末尾,就输出信息 37 if err == io.EOF { 38 fmt.Println("已到文件末尾") 39 break //读取完毕后 跳出循环,继续往下走. 40 } 41 42 fmt.Println("文件读取错误: ", err) 43 return //异常错误,就退出 44 } 45 46 } 47 fmt.Println("文件读取完毕.") 48 } 49 50 /* 51 文件打开成功 52 神龟虽寿,犹有竟时; 53 54 腾蛇乘雾,终为土灰。 55 56 老骥伏枥,志在千里; 57 58 烈士暮年,壮心不已。 59 60 盈缩之期,不但在天; 61 62 养怡之福,可得永年。 63 64 已到文件末尾 65 文件读取完毕. 66 文件已关闭 67 */
使用ioutil包 便捷读入
1 //使用ioutil包对test.txt进行简易读取. 2 //自动会进行关闭. 3 package main 4 5 import ( 6 "fmt" 7 "io/ioutil" 8 ) 9 10 func main() { 11 12 //读入指定文件的全部数据,返回[]byte类型的原始数据 13 bytes, err := ioutil.ReadFile("C:/Go/test.txt") 14 if err == nil { 15 contentStr := string(bytes) //字节转换成字符串 16 fmt.Println(contentStr) 17 } else { 18 fmt.Println("读取失败: ", err) 19 } 20 } 21 22 /* 23 神龟虽寿,犹有竟时; 24 腾蛇乘雾,终为土灰。 25 老骥伏枥,志在千里; 26 烈士暮年,壮心不已。 27 盈缩之期,不但在天; 28 养怡之福,可得永年。 29 幸甚至哉,歌以咏志。 30 */
缓冲式写出
1 //以创写追加或创写覆盖方法打开一个文件,缓冲式写出几行数据,倒干缓冲区后退出。 2 package main 3 4 import ( 5 "bufio" 6 "fmt" 7 "os" 8 ) 9 10 func main() { 11 //如果文件不存在,就创建|只能写不能读|数据追加 = 【创-写-追加 模式】 12 file, err := os.OpenFile("C:/Go/test001.txt", os.O_CREATE|os.O_RDONLY|os.O_APPEND, 0666) 13 14 //如果有异常,直接退出 15 if err != nil { 16 fmt.Println("文件打开失败: ", err) 17 return 18 } 19 20 //延时关闭文件. 21 defer func() { 22 file.Close() 23 fmt.Println("文件已关闭") 24 }() 25 26 //创建写出缓冲器 27 writer := bufio.NewWriter(file) 28 29 //分批次的写一些数据 30 writer.WriteString("女人四大愿望 ") 31 writer.WriteString("男人脑壳都坏掉 ") 32 writer.WriteString("天天给我送钞票 ") 33 writer.WriteString("还要排队等我挑 ") 34 writer.WriteString("永远青春不变老 ") 35 writer.WriteRune('你') 36 writer.WriteByte(123) 37 writer.Write([]byte{123, 124, 125}) 38 39 //倒干缓冲区 40 writer.Flush() 41 fmt.Println("写出完毕") 42 }
便捷写出
1 //这个是调用的os.openfile ,封装的。 2 package main 3 4 import ( 5 "fmt" 6 "io/ioutil" 7 ) 8 9 func main() { 10 11 //``保留原始格式 12 dataStr := `窗前明月光 13 疑是地上霜 14 举头望明月` 15 16 //字符串转为字节类型 17 dataBytes := []byte(dataStr) 18 19 err := ioutil.WriteFile("C:/Go/test001.txt", dataBytes, 0666) 20 if err != nil { 21 fmt.Println("发生了错误: ", err) 22 } else { 23 fmt.Println("写出成功") 24 } 25 }
检测文件是否存在
1 package main 2 3 import ( 4 "fmt" 5 "os" 6 ) 7 8 func main() { 9 10 info, err := os.Stat("C:/Go/test001.txt") 11 12 //判断是否有错误 13 if err != nil { 14 fmt.Println("err:", err) 15 16 //判断是否是 文件存在的错误 17 if os.IsNotExist(err) { 18 fmt.Println("文件不存在") 19 } 20 } else { 21 fmt.Println("文件存在") 22 fmt.Println(info.Name(),info.IsDir()) 23 } 24 } 25 /* 26 文件存在 27 test001.txt false 28 */
简易文件拷贝
/* 使用ioutil包做一个傻瓜式拷贝 使用io.Copys实现文件拷贝 使用缓冲区配合缓冲读写器进行图片拷贝 */
使用ioutil包做一个傻瓜式拷贝
1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 ) 7 8 func main() { 9 bytes, _ := ioutil.ReadFile("C:/Go/off.jpg") 10 err := ioutil.WriteFile("C:/Go/off002.jpg", bytes, 0666) 11 if err == nil { 12 fmt.Println("拷贝成功") 13 } else { 14 fmt.Println("拷贝失败", err) 15 } 16 }
使用io.Copy小文件拷贝
1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 ) 8 9 func main() { 10 11 //打开拷贝原文件,模式为只读模式。 12 srcFile, _ := os.OpenFile("C:/Go/off.jpg", os.O_RDONLY, 0666) 13 14 //打开要拷贝到的目标文件,模式为写和追加。 15 dstFile, _ := os.OpenFile("C:/Go/off002.jpg", os.O_WRONLY|os.O_CREATE, 0666) 16 17 //使用io.copy源文件到目标文件的copy 18 written, err := io.Copy(dstFile, srcFile) 19 if err == nil { 20 fmt.Println("成功,字节数=", written) 21 } else { 22 fmt.Println("失败: ", err) 23 } 24 25 }
超大文件copy 缓冲式拷贝
1 //使用缓冲1K的缓冲区 配合 缓冲读取器 进行大图片拷贝 2 package main 3 4 import ( 5 "bufio" 6 "fmt" 7 "io" 8 "os" 9 ) 10 11 func main() { 12 13 //打开拷贝原文件,模式为只读模式。 14 srcFile, _ := os.OpenFile("C:/Users/chaoyang.xu/Desktop/0001.jpg", os.O_RDONLY, 0666) 15 16 //打开目标文件 17 dstFile, _ := os.OpenFile("C:/Users/chaoyang.xu/Desktop/0002.jpg", os.O_WRONLY|os.O_CREATE, 0666) 18 19 //延时关闭文件 20 defer func() { 21 srcFile.Close() 22 dstFile.Close() 23 fmt.Println("文件全部关闭") 24 }() 25 26 //创建缓冲读取器 27 reader := bufio.NewReader(srcFile) 28 29 //创建目标文件写出器 30 writer := bufio.NewWriter(dstFile) 31 32 //创建小缓冲区 大小 1024 33 buffer := make([]byte, 1024) 34 35 //循环一桶一桶的读入数据到水桶(缓冲区),直到io.EOF 36 for { 37 _, err := reader.Read(buffer) 38 if err != nil { 39 if err == io.EOF { 40 fmt.Println("源文件读取完毕.") 41 break 42 } else { 43 fmt.Println("读取文件发现错误: ", err) 44 return 45 } 46 } else { 47 //每桶数据写入到目标 48 _, err := writer.Write(buffer) 49 if err != nil { 50 fmt.Println("写文件发现错误: ", err) 51 return 52 } 53 } 54 } 55 56 fmt.Println("拷贝完毕.") 57 58 }
字符统计案例
1 //使用缓冲1K的缓冲区 配合 缓冲读取器 进行大图片拷贝 2 package main 3 4 import ( 5 "fmt" 6 "io/ioutil" 7 ) 8 9 func main() { 10 11 bytes, _ := ioutil.ReadFile("C:/Go/test.txt") 12 contentStr := string(bytes) 13 fmt.Println(contentStr) 14 15 var numCount, letterCount, spaceCount int 16 17 //统计0-9,a-z,A-Z,特殊字符个数 18 for _, c := range contentStr { 19 if c >= '0' && c <= '9' { 20 numCount ++ 21 } else if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') { 22 letterCount++ 23 } else if c == ' ' || c == ' ' || c == ' ' || c == ' ' { 24 spaceCount++ 25 } 26 } 27 fmt.Println("numCount= ", numCount) 28 fmt.Println("numCount= ", letterCount) 29 fmt.Println("numCount= ", spaceCount) 30 31 } 32 /* 33 神龟虽寿,犹有竟时; 34 腾蛇乘雾,终为土灰。 35 老骥伏枥,志在千里; 36 烈士暮年,壮心不已。 37 盈缩之期,不但在天; 38 养怡之福,可得永年。 39 幸甚至哉,歌以咏志。 40 12345 41 54321 42 abc 43 cba 44 numCount= 10 45 numCount= 6 46 numCount= 20 47 */