20.Go语言·文件操作

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 相关知识,请参考://www.greatytc.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
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容