zoukankan      html  css  js  c++  java
  • 【原创】go语言学习(十五)IO操作2

    目录

    • 文件打开和读写
    • 读取压缩文件
    • bufio原理和cat命令实现
    • defer详解

    文件打开和读写

    1、 文件是存储在外部介质上的数据集合。

    A. 文件分类:文本文件和二进制文件

    B. 文件存取方式:随机存取和顺序存放

    2、文件打开

    package main
    import (
        "bufio"
        "fmt"
        "io"
        "os"
    )
    func main() {
        //只读的方式打开
        inputFile, err := os.Open("input.dat")
        if err != nil {
            fmt.Printf("open file err:%v
    ", err)
            return
        }
        defer inputFile.Close()
    }
    

      

    3、文件读取, file.Read和file.ReadAt。读到文件末尾返回:io.EOF

    package main
    import (
        "bufio"
        "fmt"
        "io"
        "os"
    )
    func main() {
        //只读的方式打开
        inputFile, err := os.Open("input.dat")
        if err != nil {
            fmt.Printf("open file err:%v
    ", err)
            return
        }
        var buf[128]byte
        inputFile.Read(buf[:])
        defer inputFile.Close()
    }
    

      

    4、 bufio原理

     5、bufio读取文件

    package main
    import (
        "bufio"
        "fmt"
        "io"
        "os"
    )
    func main() {
        inputFile, err := os.Open("input.dat")
        if err != nil {
            fmt.Printf("open file err:%v
    ", err)
            return
        }
        defer inputFile.Close()
        inputReader := bufio.NewReader(inputFile)
        for {
            inputString, readerError := inputReader.ReadString('
    ')
            if readerError == io.EOF {
                return
            }
            fmt.Printf("The input was: %s", inputString)
        }
    }
    

      

    6、读取整个文件示例

    package main
    import (
        "fmt"
        "io/ioutil"
        "os"
    )
    func main() {
        inputFile := "products.txt"
        outputFile := "products_copy.txt"
        buf, err := ioutil.ReadFile(inputFile)
        if err != nil {
            fmt.Fprintf(os.Stderr, "File Error: %s
    ", err)
            return
        }
        fmt.Printf("%s
    ", string(buf))
    }
    

      

    读取压缩文件

    1、读取压缩文件

    package main
    import (
        "bufio"
        "compress/gzip"
        "fmt"
        "os"
    )
    func main() {
        fName := "MyFile.gz"
        var r *bufio.Reader
        fi, err := os.Open(fName)
        if err != nil {
            fmt.Fprintf(os.Stderr, "%v, Can’t open %s: error: %s
    ", os.Args[0], fName, err)
            os.Exit(1)
        }
        fz, err := gzip.NewReader(fi)
        if err != nil {
            fmt.Fprintf(os.Stderr, "open gzip failed, err: %v
    ", err)
            return
        }
        r = bufio.NewReader(fz)
        for {
            line, err := r.ReadString('
    ')
            if err != nil {
                fmt.Println("Done reading file")
                os.Exit(0)
            }
            fmt.Println(line)
        }
    }
    

      

    bufio原理和cat命令实现

    1、文件写入

    文件读写
    os.OpenFile(“output.dat”, os.O_WRONLY|os.O_CREATE, 0666)
    1. os.O_WRONLY:只写
    第二个参数:文件打开模式

    r ——> 004
    w——> 002
    x——> 001
    第三个参数:权限控制:
    2. os.O_CREATE:创建文件
    3. os.O_RDONLY:只读
    4. os.O_RDWR:读写
    5. os.O_TRUNC :清空
    6. os. O_APPEND:追加

    2、文件写入示例

    file.Write()
    file.WriteAt()
    file.WriteString()

    package main
    import (
        "bufio"
        "fmt"
        "os"
    )
    func main() {
        outputFile, outputError := os.OpenFile("output.dat",
        os.O_WRONLY|os.O_CREATE, 0666)
        if outputError != nil {
            fmt.Printf("An error occurred with file creation
    ")
            return
        }
        str := “hello world”
        outputFile.Write([]byte(str))
        defer outputFile.Close()
    }
    

      

    3、 文件写入示例

    package main
    import (
        "bufio"
        "fmt"
        "os"
    )
    func main() {
        outputFile, outputError := os.OpenFile("output.dat",
        os.O_WRONLY|os.O_CREATE, 0666)
        if outputError != nil {
            fmt.Printf("An error occurred with file creation
    ")
            return
        }
        defer outputFile.Close()
        outputWriter := bufio.NewWriter(outputFile)
        outputString := "hello world!
    "
        for i := 0; i < 10; i++ {
            outputWriter.WriteString(outputString)
        }
        outputWriter.Flush()
    }
    

      

    4、写入整个文件示例

    package main
    import (
        "fmt"
        "io/ioutil"
        "os"
    )
    func main() {
        inputFile := "products.txt"
        outputFile := "products_copy.txt"
        buf, err := ioutil.ReadFile(inputFile)
        if err != nil {
            fmt.Fprintf(os.Stderr, "File Error: %s
    ", err)
            return
        }
        fmt.Printf("%s
    ", string(buf))
        err = ioutil.WriteFile(outputFile, buf, 0x644)
        if err != nil {
            panic(err.Error())
        }
    }
    

      

    5、拷贝文件

    package main
    import (
        "fmt"
        "io"
        "os"
    )
    func main() {
        CopyFile("target.txt", "source.txt")
        fmt.Println("Copy done!")
    }
    func CopyFile(dstName, srcName string) (written int64, err error) {
        src, err := os.Open(srcName)
        if err != nil {
            return
        }
        defer src.Close()
        dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
        if err != nil {
            return
        }
        defer dst.Close()
        return io.Copy(dst, src)
    }
    

      

    6、cat命令实现

    package main
    import (
        "bufio"
        "flag"
        "fmt"
        "io"
        "os"
    )
    func cat(r *bufio.Reader) {
        for {
            buf, err := r.ReadBytes('
    ')
            if err == io.EOF {
                break
            }
            fmt.Fprintf(os.Stdout, "%s", buf)
            return
        }
    }
    func main() {
        flag.Parse()
        if flag.NArg() == 0 {
            cat(bufio.NewReader(os.Stdin))
        }
        for i := 0; i < flag.NArg(); i++ {
            f, err := os.Open(flag.Arg(i))
            if err != nil {
                fmt.Fprintf(os.Stderr, "%s:error reading from %s: %s
    ",
                os.Args[0], flag.Arg(i), err.Error())
                continue
            }
            cat(bufio.NewReader(f))
        }
    }
    

      

    defer详解

    1、defer原理分析

    2、defer案例

    package main
    import (
        "fmt"
    )
    func funcA() int {
        x := 5
        defer func() {
            x += 1
        }()
        return x
    }
    func main() {
        fmt.Println(funcA())
    }
    

      

    3、defer案列2

    package main
    import "fmt"
    func funcB() (x int) {
        defer func() {
            x += 1
        }()
        return 5
    }
    func main() {
        fmt.Println(funcB())
    }
    

      

    4、defer案例3

    package main
    import "fmt"
    func funcC() (y int) {
        x := 5
        defer func() {
            x += 1
        }()
        return x
    }
    func main() {
        fmt.Println(funcC())
    }
    

      

    5、defer案例4

    package main
    import "fmt"
    func funcD() (x int) {
        defer func(x int) {
            x += 1
        }(x)
        return 5
    }
    func main() {
        fmt.Println(funcD())
    }
    

      

  • 相关阅读:
    通过反射将一个java对象的属性值转换为一个Map
    反射中的 Method 的 getReadMethod 与 getWriteMethod 使用 【获取一个对象的所有属性字段名称和其对应的值】
    maven项目无法导入Oracle的jdbc连接jar包【我】
    史上最全最详细JNDI数据源配置说明
    启动eclipse导致Tomcat的配置文件重置
    各种集合key,value能否为null
    CentOS系统使用yum安装配置MariaDB数据库
    Unity导出webPlayer并且部署到IIS
    unity web项目发布服务器Data file is corrupt (not a Unity W
    Unity3d Web Player 的server端联网配置
  • 原文地址:https://www.cnblogs.com/wangshuyang/p/11813738.html
Copyright © 2011-2022 走看看