• 文件操作


    打开和关闭文件

    /*
    简易方式打开一个文件,拿着一顿骚操作,一秒后关闭.
    以只读方式打开一个文件,创建其带缓冲的读取器,读取文件到末尾.
    使用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  */

     

     

  • 相关阅读:
    在 Asp.NET MVC 中使用 SignalR 实现推送功能
    开发高效的Tag标签系统数据库设计
    【译】ASP.NET MVC 5 官方教程
    介绍 ASP.NET Identity
    iOS使用UIWebView遇到Error Domain=WebKitErrorDomain Code=101 “The operation couldn’t be completed. (WebKitErrorDomain error 101
    浏览器是怎样工作的:渲染引擎,HTML解析
    堆 和 栈的 区别(经典)
    Javascript的堆和栈的简单理解
    页面呈现、重绘、回流。
    什么是 dynaTrace Ajax
  • 原文地址:https://www.cnblogs.com/chaoyangxu/p/11949253.html
Copyright © 2020-2023  润新知