zoukankan      html  css  js  c++  java
  • [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)
    }
    
  • 相关阅读:
    C# 不用添加WebService引用,调用WebService方法
    贪心 & 动态规划
    trie树 讲解 (转载)
    poj 2151 Check the difficulty of problems (检查问题的难度)
    poj 2513 Colored Sticks 彩色棒
    poj1442 Black Box 栈和优先队列
    啦啦啦
    poj 1265 Area(pick定理)
    poj 2418 Hardwood Species (trie树)
    poj 1836 Alignment 排队
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/12111231.html
Copyright © 2011-2022 走看看