• [go]文件读写&io操作


    流操作

    Go教程:21-io.Reader/Writer详解

    可读可写stream - 原理

    I/O操作也叫输入输出操作.其中I是指Input,O是指Output,用于读或者写数据的,有些语言中也叫流操作, 是指数据通信的通道.
    Golang 标准库对 IO 的抽象非常精巧,各个组件可以随意组合,可以作为接口设计的典范.

    Go原生的pkg中有一些核心的interface,其中io.Reader/Writer是比较常用的接口. Go Writer 和 Reader接口的设计遵循了Unix的输入和输出,一个程序的输出可以是另外一个程序的输入.

    // io.Reader/Writer,有几个常用的实现:
    
    net.Conn: 网络
    os.Stdin, os.Stdout, os.Stderr: console终端标准输出,err
    os.File: 网络、标准输入输出、文件的流读取
    strings.Reader: 把字符串抽象成Reader
    bytes.Reader: 把[]byte抽象成Reader
    bytes.Buffer: 把[]byte抽象成Reader和Writer
    bufio.Reader/Writer: 抽象成带缓冲的流读取(比如按行读写)
    

    go文件方法继承 -- 源码

    读文件 -- 使用

    
    //os.OpenFile
    f, _ := os.OpenFile("/etc/hosts", os.O_RDONLY, 0600)
    buf := make([]byte, 128)
    n, _ := f.Read(buf)
    fmt.Println(string(buf[:n]))
    
    //os.Open - 使用数组
    f, _ := os.Open("/etc/hosts")
    var buf [128]byte
    n, _ := f.Read(buf[:])
    fmt.Println(string(buf[:n]))
    
    
    //os.Open - 直接初始化切片
    f, err := os.Open("/etc/hosts")
    buf := make([]byte, 5)
    n, err := f.Read(buf)
    fmt.Println(string(buf[:n]))
    
    //f.Read读一个完整的文件
    f, _ := os.Open("/etc/hosts")
    buf := make([]byte, 128)
    for {
        n, err := f.Read(buf)
        fmt.Println(string(buf[:n]))
        if err==io.EOF{
            break
        }
    }
    
    //ioutil.ReadFile
    buf, _ := ioutil.ReadFile("/etc/hosts")
    fmt.Println(string(buf))
    
    //ioutil.ReadAll
    f, _ := os.OpenFile("/etc/hosts", os.O_RDONLY, 0600)
    buf, _ := ioutil.ReadAll(f)
    fmt.Println(string(buf))
    
    // bufio.NewReader
    r := strings.NewReader("Go is a general-purpose language designed with systems programming in mind.")
    buf, _ := ioutil.ReadAll(r)
    fmt.Println(string(buf))
    

    json/struct操作

    读写 - 常见go类型

    Golang 中使用 JSON 的小技巧
    Go - 如何解析 JSON 数据?

    写字符串
    写对象
    写数组
    写字段嵌套的数组
    
    // 写数组
    user := []string{
        "m1",
        "m2",
        "m3",
    }
    f, _ := os.Create("./data.txt")
    b, _ := json.Marshal(user)
    f.Write(b)
    defer f.Close()
    
    //读数组
    var arr []string
    
    b, _ := ioutil.ReadFile("./data.txt")
    json.Unmarshal(b, &arr)
    fmt.Printf("%T",arr)
    
    //写对象
    type user struct {
        Name string `json:"name"`
        Age  int    `json:"age"`
    }
    u1 := user{
        Name: "m1",
        Age:  22,
    }
    f, _ := os.Create("./data.txt")
    b, _ := json.Marshal(u1)
    f.Write(b)
    defer f.Close()
    
    //读对象
    var obj user
    
    b, _ := ioutil.ReadFile("./data.txt")
    json.Unmarshal(b, &obj)
    fmt.Printf("%T,%v", obj, obj)
    
    //写[obj,]
    type user struct {
        Name string `json:"name"`
        Age  int    `json:"age"`
    }
    
    m:= []user{
        {"m1",1},
        {"m2",2},
    }
    
    f, _ := os.Create("./data.txt")
    b, _ := json.Marshal(m)
    f.Write(b)
    defer f.Close()
    
    //读[obj,]
    
    var arr []user
    
    b, _ := ioutil.ReadFile("./data.txt") //会自动帮你初始化arr
    json.Unmarshal(b, &arr)
    fmt.Printf("%T,%v", arr, arr)
    
    // 一个简易下载器
    
    resp, _ := http.Get("https://mojotv.cn/assets/image/logo01.png")
    f, _ := os.Create("./a.jpg")
    defer f.Close()
    io.Copy(f, resp.Body)
    

    文件打开模式

    创建/写文件

    // golang创建文本文件
    
        f,err := os.Create(fileName)
        defer f.Close()
        if err !=nil {
            fmt.Println(err.Error())
        } else {
            _,err=f.Write([]byte("要写入的文本内容"))
            checkErr(err)
        }
    
    // golang读取文本文件
    
    f, err := os.OpenFile(fileName, os.O_RDONLY,0600)
    defer f.Close()
    if err !=nil {
        fmt.Println(err.Error())
    } else {
        contentByte,err=ioutil.ReadAll(f)
        checkErr(err)
    	fmt.Println(string(contentByte))
    }
    OpenFile用法:os.OpenFile(文件名,打开方式,打开模式)
    
    //打开方式
    const (
    //只读模式
    O_RDONLY int = syscall.O_RDONLY // open the file read-only.
    //只写模式
    O_WRONLY int = syscall.O_WRONLY // open the file write-only.
    //可读可写
    O_RDWR int = syscall.O_RDWR // open the file read-write.
    //追加内容
    O_APPEND int = syscall.O_APPEND // append data to the file when writing.
    //创建文件,如果文件不存在
    O_CREATE int = syscall.O_CREAT // create a new file if none exists.
    //与创建文件一同使用,文件必须存在
    O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist
    //打开一个同步的文件流
    O_SYNC int = syscall.O_SYNC // open for synchronous I/O.
    //如果可能,打开时缩短文件
    O_TRUNC int = syscall.O_TRUNC // if possible, truncate file when opened.
    )
    
    //打开模式
    const (
    ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory 文件夹模式
    ModeAppend // a: append-only 追加模式
    ModeExclusive // l: exclusive use 单独使用
    ModeTemporary // T: temporary file (not backed up) 临时文件
    ModeSymlink // L: symbolic link 象征性的关联
    ModeDevice // D: device file 设备文件
    ModeNamedPipe // p: named pipe (FIFO) 命名管道
    ModeSocket // S: Unix domain socket Unix 主机 socket
    ModeSetuid // u: setuid 设置uid
    ModeSetgid // g: setgid 设置gid
    ModeCharDevice // c: Unix character device, when ModeDevice is set Unix 字符设备,当设备模式是设置Unix
    ModeSticky // t: sticky 粘性的
    // Mask for the type bits. For regular files, none will be set. bit位遮盖.不变的文件设置为none
    ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
    ModePerm FileMode = 0777 // Unix permission bits 权限位.
    )
    
    
    // golang写入文本文件
    
    f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC, 0600)
    defer f.Close()
    if err != nil {
        fmt.Println(err.Error())
    } else {
         _,err=f.Write([]byte("要写入的文本内容"))
        checkErr(err)
    }
    
  • 相关阅读:
    14.3.1选择选项
    14.3 选择框表单
    14.2.4HTML5约束API验证
    input标签之外是否一定添加form标签
    14.2.3自动切换焦点
    php设计模式---抽象模式模式
    php设计模式---简单工厂模式
    git基本教程,每天更新
    第5章 卷积神经网络
    第3章 深度学习基础
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/12111231.html
Copyright © 2020-2023  润新知