美文网首页
20.Go语言·文件操作

20.Go语言·文件操作

作者: 一枼落知天下 | 来源:发表于2019-06-10 14:17 被阅读0次

    main.go

    // Go语言·文件操作
    package main
    
    //  包的本质是创建不同的文件夹
    //  go的每一个文件都是属于一个包的
    //  go以包的形式管理项目和文件目录。
    //  import "包的路径"
    import (
        model "day26/model"
    )
    
    var content string = `
    ————————————————Go语言·文件操作————————————————————
    一、文件基本介绍
        1.数据源(保存数据数据的地方)
        2.文件在程序中是以流的形式来操作。
        3.流是数据在数据源(文件)和程序(内存)之间经历的路径
        4.输入流:数据从数据源(文件)到程序(内存)的路径
            文件------》Go程序(内存):输入流[读文件]
        5.输出流:数据从程序(内存)到数据源(文件)的路径
            Go程序(内存)----》文件:   输出流[写文件] 
        package os.File
        import "os"
        type File struct{}
        File打开的文件对象。或句柄
        File说明:
             1.文件对象
             2.文件指针
             3.文件句柄
        func (f *File)Read(){}
    二、读文件
        第一种方式:读取文件,带缓冲,大小文件处理 ,逐行读取,一行一行的处理
            import (
                "os"
                "bufio"
                "io"
            )
            file,err := os.Open(filepath)
            defer file.Close()
            // *reader 带缓冲
            reader := bufio.NewReader(file)
            // 循环读取
            for {
                // 一行一行的读取
                str,err := reader.ReadString('\n')
                // io.EOF表示文件的末尾
                fmt.Print(str)
                if err == io.EOF { 
                    break
                }
            }
        第二种方式:一次性的将文件全部内容读取到内存,处理小文件
            import "io/ioutil"
            不需要显示的开启和关闭文件
            文件的开启和关闭 被封装到ReadFile
            file,err := ioutil.ReadFile(filepath)
            file []byte 切片 string(file)
    三、写文件
        os.OpenFile(文件名,打开的模式,文件权限)
        打开的模式:
            os.O_WRONLY|os.O_CREATE 写|创建
            os.O_WRONLY|os.O_TRUNC  写|覆盖
            O_WRONLY|os.O_APPEND    写|追加
            os.O_RDWR|os.O_APPEND   读写|追加 
        文件权限:
            rwx 421
        第一种方式:
            file,err := os.OpenFile(filepath,os.O_WRONLY|os.O_CREATE,0666)
            // 及时关闭句柄,否则会有内存泄漏
            defer file.Close()
            // *writer 使用带缓存的。
            writer := bufio.NewWriter(file)
            for i := 0; i < 5; i++ {
                writer.WriteString(content)
            }
            // 将缓存中的数据,写入的文件
            writer.Flush()
        第二种方式:
            var filepath = "D:/日常工作/go/src/day26/data/2.txt"
            var newfilepath = "D:/日常工作/go/src/day26/data/3.txt"
            data,err := ioutil.ReadFile(filepath)
            if err != nil {
                fmt.Println("ReadFile:",err)
                return 
            }
            err = ioutil.WriteFile(newfilepath, data, 0666)
            if err != nil {
                fmt.Println("WriteFile:",err)
                return 
            }
    三、判断文件或目录是否存在
        func exists(path string) (bool, error) {
            _, err := os.Stat(path)
            if err == nil {
                return true, nil
            }
            if os.IsNotExist(err) {
                return false, nil
            }
            return false, err
        }
    四、拷贝文件[图片、电影、音频等]
        import "io"
        func Copy(dst Writer, src Reader) (written int64, err error)
    
    五、统计文件
    
    `
    
    func main() {
        model.Entry()
    }
    

    modle/FileHandle.go

    
    package model
    
    import (
        "fmt"
        "os"
        "bufio"
        "io"
        "io/ioutil"
    )
    
    /**
     * [Init 入口]
     * @author Jhou Shuai
     * @datetime 2019-05-18T11:58:33+0800
     */
    func Entry() {
        countFileHandle()
    }
    
    /**
     * [openFileHandle 打开和关闭文件]
     * @author Jhou Shuai
     * @datetime 2019-06-10T09:04:52+0800
     */
    func openFileHandle() {
        // 打开一个文件 open
        // file:
        //  1.文件对象
        //  2.文件指针
        //  3.文件句柄
        file,err := os.Open("D:\\日常工作\\go\\src\\day26\\data\\1.txt")
        if err != nil {
            fmt.Println(err)
        }
    
        fmt.Printf("file=%v",file)
    
        // 关闭一个文件 close是结构体file的方法
        err = file.Close()
        if err != nil {
            fmt.Println("close fail",err)
        }
    }
    
    /**
     * 读取文件,并显示终端,带缓冲
     * 大小文件处理
     * 逐行读取,一行一行的处理
     */
    func readFileHandle() {
        // 打开一个文件 
        file,err := os.Open("D:\\日常工作\\go\\src\\day26\\data\\1.txt")
        if err != nil {
            fmt.Println(err)
            return 
        }
        //关闭一个文件 ,及时关闭句柄,否则会有内存泄漏
        //defer 相关知识,请参考:https://www.jianshu.com/p/2d6f4477a061
        // defer 的使用
        // 当执行到defer时,暂时不执行,会将defer后的语句压入到独立的栈(defer栈)
        // 当函数执行完毕后。再从defer栈 按照先进后出的方式出栈,执行。
        // defer最佳实践:
        // 创建一个资源后(比如:打开咯一个文件句柄,一个数据连接,或者是锁资源)
        // 可以马上执行defer resource.Close()
        // 在defer后,任然可以继续使用该资源
        // 当函数执行完毕后,系统会依次从defer栈中,取出语句,关闭资源
        // 这种机制,非常简洁,不用再为何时关闭资源而烦恼
        defer file.Close()
    
        // *reader 带缓冲
        reader := bufio.NewReader(file)
    
        // 循环读取
        for {
            // 一行一行的读取
            str,err := reader.ReadString('\n')
            // io.EOF表示文件的末尾
            fmt.Print(str)
            if err == io.EOF { 
                break
            }
        }   
    }
    
    
    // 一次性的将文件读取到内存
    // 处理小文件
    func readFileOnce(){
        // 不需要显示的开启和关闭文件
        // 文件的开启和关闭 被封装到ReadFile
        var filename = "D:\\日常工作\\go\\src\\day26\\data\\1.txt"
        file,err := ioutil.ReadFile(filename)
        if err != nil {
            fmt.Printf("err=%v",err)
        }
        // file []byte 切片 string(file)
        fmt.Printf("%v", string(file))
        // fmt.Printf("%s", file)
    }
    
    
    // 写文件
    func writeFileHandle() {
        //1.新建一个文件,写入内容
        // var filepath = "D:/日常工作/go/src/day26/data/2.txt"
        // os.O_WRONLY|os.O_CREATE
        // file,err := os.OpenFile(filepath,os.O_WRONLY|os.O_CREATE,0666)
        // if err != nil {
        //  fmt.Printf("err=%v \n",err)
        //  return 
        // }
        // // 及时关闭句柄,否则会有内存泄漏
        // defer file.Close()
        
        // content := "Hello World\r\n"
    
        // // *writer 使用带缓存的。
        // writer := bufio.NewWriter(file)
        // for i := 0; i < 5; i++ {
        //  writer.WriteString(content)
        // }
        // // 将缓存中的数据,写入的文件
        // writer.Flush()   
        
        // 2.打开一个已经存在的文件,并覆盖原来的内容。
        // var filepath = "D:/日常工作/go/src/day26/data/2.txt"
        // // os.O_WRONLY|os.O_TRUNC 
        // file,err := os.OpenFile(filepath,os.O_WRONLY|os.O_TRUNC,0666)
        // if err != nil {
        //  fmt.Printf("err=%v \n",err)
        //  return 
        // }
        // // 及时关闭句柄,否则会有内存泄漏
        // defer file.Close()
        
        // content := "关闭句柄,否则会有内存泄漏\r\n"
    
        // // *writer 使用带缓存的。
        // writer := bufio.NewWriter(file)
        // for i := 0; i < 5; i++ {
        //  writer.WriteString(content)
        // }
        // // 将缓存中的数据,写入的文件
        // writer.Flush()
        
    
        // 3.打开一个已经存在的文件,并在原来的基础上追加内容。
        // var filepath = "D:/日常工作/go/src/day26/data/2.txt"
        // // O_WRONLY|os.O_APPEND 
        // file,err := os.OpenFile(filepath,os.O_WRONLY|os.O_APPEND,0666)
        // if err != nil {
        //  fmt.Printf("err=%v \n",err)
        //  return 
        // }
        // // 及时关闭句柄,否则会有内存泄漏
        // defer file.Close()
        
        // content := "\t————帅哥哥\r\n"
    
        // // *writer 使用带缓存的。
        // writer := bufio.NewWriter(file)
        // writer.WriteString(content)
        // // 将缓存中的数据,写入的文件
        // writer.Flush()
    
        // 4.打开一个已经存在的文件,并在原来的基础上追加内容。并显示终端
        // var filepath = "D:/日常工作/go/src/day26/data/2.txt"
        // // os.O_RDWR|os.O_APPEND
        // file,err := os.OpenFile(filepath,os.O_RDWR|os.O_APPEND,0666)
        // if err != nil {
        //  fmt.Printf("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)
        // }
    
        // // 追加新内容
        // content := "\t————小美眉\r\n"
        // // *writer 使用带缓存的。
        // writer := bufio.NewWriter(file)
        // writer.WriteString(content)
        // // 将缓存中的数据,写入的文件
        // writer.Flush()
        
        var filepath = "D:/日常工作/go/src/day26/data/2.txt"
        var newfilepath = "D:/日常工作/go/src/day26/data/3.txt"
        data,err := ioutil.ReadFile(filepath)
        if err != nil {
            fmt.Println("ReadFile:",err)
            return 
        }
        err = ioutil.WriteFile(newfilepath, data, 0666)
        if err != nil {
            fmt.Println("WriteFile:",err)
            return 
        }
    }
    
    /**
     * [copyFileHandle 文件拷贝]
     * @author Jhou Shuai
     * @datetime 2019-06-10T12:26:37+0800
     * func Copy(dst Writer, src Reader) (written int64, err error)
     */
    func copyFileHandle() {
        var dst string = "D:/日常工作/go/src/day26/data/帅.png"
        var src string = "D:/生活娱乐/帅哥WIN10系统截图.png"
    
        srcFile ,err := os.Open(src)
        if err != nil {
            fmt.Println("OPEN ERR:",err)
            return 
        }
        defer srcFile.Close()
        reader := bufio.NewReader(srcFile)
    
    
        dstFile,err := os.OpenFile(dst,os.O_WRONLY|os.O_CREATE,0666)
        if err != nil {
            fmt.Println("OpenFile ERR:",err)
            return 
        }
        defer dstFile.Close()
    
        writer := bufio.NewWriter(dstFile)
        if _, err = io.Copy(writer, reader); err != nil {
            fmt.Println("Copy ERR:",err)
            return
        }
        fmt.Println("拷贝成功!")
    }
    
    
    type charCount struct {
        chCount int
        NumCount int
        SpaceCount int
        OtherCount int
    }
    
    
    func countFileHandle() {
        // 打开一个文件,创建一个reader
        // 每读取一行,就去统计该行有多少英文、数字、空格和其他字符
        // 然后将结果保存到一个结构体
        var filepath = "D:/日常工作/go/src/day26/data/2.txt"
        file,err := os.Open(filepath)
        if err != nil {
            fmt.Println("文件打不开,",err)
            return 
        }
    
        defer file.Close()
    
        var count charCount
    
        reader := bufio.NewReader(file)
    
        for {
            str, err := reader.ReadString('\n')
            // 遍历str,进行统计
            for _,val := range []rune(str){
                switch {
                    case val >= 'a' && val <= 'z':
                        fallthrough
                    case val >= 'A' && val <= 'Z':
                        count.chCount++
                    case val == '\t' || val == ' ':
                        count.SpaceCount++
                    case val >='0' && val <= '9':
                        count.NumCount++
                    default:
                        count.OtherCount++
                }
            }
            
            if err == io.EOF {
                break;
            }
        }
        
        fmt.Printf("字母:%v,空格:%v,数字:%v,其他:%v \n",
            count.chCount,
            count.SpaceCount,
            count.NumCount,
            count.OtherCount)
    
    }
    
    
    
    /**
     * [exists 判断文件或目录是否存在]
     * @author Jhou Shuai
     * @datetime 2019-06-10T12:24:19+0800
     */
    func exists(path string) (bool, error) {
        _, err := os.Stat(path)
        if err == nil {
            return true, nil
        }
        if os.IsNotExist(err) {
            return false, nil
        }
        return false, err
    }
    

    相关文章

      网友评论

          本文标题:20.Go语言·文件操作

          本文链接:https://www.haomeiwen.com/subject/rorzxctx.html