首页 > 其他分享 >Go_IO操作

Go_IO操作

时间:2022-10-10 13:34:30浏览次数:44  
标签:文件 func IO err fmt file Go 操作 os

1.输入输出的底层原理

终端其实是一个文件,相关实例如下:

  • os.Stdin:标准输入的文件实例,类型为*File
  • os.Stdout:标准输出的文件实例,类型为*File
  • os.Stderr:标准错误输出的文件实例,类型为*File

以文件的方式操作终端:

package main

import "os"

func main() {
    var buf [16]byte
    os.Stdin.Read(buf[:])
    os.Stdin.WriteString(string(buf[:]))
}

2. 文件操作相关API

  • func Create(name string) (file *File, err Error)
    根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666

  • func NewFile(fd uintptr, name string) *File
    根据文件描述符创建相应的文件,返回一个文件对象

  • func Open(name string) (file *File, err Error)
    只读方式打开一个名称为name的文件

  • func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
    打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限

  • func (file *File) Write(b []byte) (n int, err Error)
    写入byte类型的信息到文件

  • func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
    在指定位置开始写入byte类型的信息

  • func (file *File) WriteString(s string) (ret int, err Error)
    写入string信息到文件

  • func (file *File) Read(b []byte) (n int, err Error)
    读取数据到b中

  • func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
    从off开始读取数据到b中

  • func Remove(name string) Error
    删除文件名为name的文件

3. 打开和关闭文件

os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

package main

import (
    "fmt"
    "os"
)

func main() {
    // 只读方式打开当前目录下的main.go文件
    file, err := os.Open("./main.go")
    if err != nil {
        fmt.Println("open file failed!, err:", err)
        return
    }
    // 关闭文件
    file.Close()
}

4. 写文件

package main

import (
    "fmt"
    "os"
)

func main() {
    // 新建文件
    file, err := os.Create("./xxx.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()
    for i := 0; i < 5; i++ {
        file.WriteString("ab\n")
        file.Write([]byte("cd\n"))
    }
}

5. 读文件

文件读取可以用file.Read()和file.ReadAt(),读到文件末尾会返回io.EOF的错误

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    // 打开文件
    file, err := os.Open("./xxx.txt")
    if err != nil {
        fmt.Println("open file err :", err)
        return
    }
    defer file.Close()
    // 定义接收文件读取的字节数组
    var buf [128]byte
    var content []byte
    for {
        n, err := file.Read(buf[:])
        if err == io.EOF {
            // 读取结束
            break
        }
        if err != nil {
            fmt.Println("read file err ", err)
            return
        }
        content = append(content, buf[:n]...)
    }
    fmt.Println(string(content))
}

6. 拷贝文件

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    // 打开源文件
    srcFile, err := os.Open("./xxx.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 创建新文件
    dstFile, err2 := os.Create("./abc2.txt")
    if err2 != nil {
        fmt.Println(err2)
        return
    }
    // 缓冲读取
    buf := make([]byte, 1024)
    for {
        // 从源文件读数据
        n, err := srcFile.Read(buf)
        if err == io.EOF {
            fmt.Println("读取完毕")
            break
        }
        if err != nil {
            fmt.Println(err)
            break
        }
        //写出去
        dstFile.Write(buf[:n])
    }
    srcFile.Close()
    dstFile.Close()
}

7. bufio

  • bufio包实现了带缓冲区的读写,是对文件读写的封装
  • bufio缓冲写数据

os.O_WRONLY //只写
os.O_CREATE //创建文件
os.O_RDONLY //只读
os.O_RDWR //读写
os.O_TRUNC //清空
os.O_APPEND //追加

  • bufio读数据
package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func wr() {
    // 参数2:打开模式,所有模式d都在上面
    // 参数3是权限控制
    // w写 r读 x执行   w  2   r  4   x  1
    file, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        return
    }
    defer file.Close()
    // 获取writer对象
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        writer.WriteString("hello\n")
    }
    // 刷新缓冲区,强制写出
    writer.Flush()
}

func re() {
    file, err := os.Open("./xxx.txt")
    if err != nil {
        return
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    for {
        line, _, err := reader.ReadLine()
        if err == io.EOF {
            break
        }
        if err != nil {
            return
        }
        fmt.Println(string(line))
    }

}

func main() {
    re()
}

标签:文件,func,IO,err,fmt,file,Go,操作,os
From: https://www.cnblogs.com/qi66/p/16775367.html

相关文章

  • 37、linux下安装python3.6和django
    37.1、安装python:1、python介绍:python是一种面向对象的,解释型的计算机语言,它的特点是语法简介,优雅,简单易学。1989年诞生,Guido(龟叔)开发。编译型语言:代码在编译之后,编译成......
  • Go_Goroutine详解
    Goroutine详解goroutine的概念类似于线程,但goroutine是由Go的运行时(runtime)调度和管理的。Go程序会智能地将goroutine中的任务合理地分配给每个CPU。Go语言之所以被称......
  • NationalInstruments(一)深圳市裕量科技有限公司
    深圳市裕量科技有限公司 http://www.szmgt.com.cn/ WPFNationalInstruments绘制折线图下载引用NationalInstruments相关的3个dll   把NationalInstruments.Co......
  • 49、django工程(cookie+session)
    49.1、介绍:1、cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。cookie的工作原理是,由服务器产......
  • Python 之列表-元组-字典-IO处理
    一、列表#len(list)列表元素个数#max(list)返回列表元素最大值#min(list)返回列表元素最小值#list(seq)将元组转换为列表#list.append(obj)在列表末尾添加新的......
  • iostat命令
    一、概述iostat主要用于输出磁盘IO和CPU的统计信息iostat属于sysstat软件包,可以用yum installsysstat直接安装二、iostat用法1、用法:iostat[选项][<时间间隔>......
  • Trigonometric functions
    Trigonometricfunctions标签(空格分隔):三角函数Unitright-angletriangle{#1}\(\sin\theta=\frac{opposite\quadside}{hypotenuse}\)\(\cos\theta=\frac{adjacent......
  • 46、django工程(view)
    46.1、djangoview视图函数说明:1、http请求中产生两个核心对象:(1)http请求:HttpRequest对象。(2)http响应:HttpResponse对象。2、views函数是接收用户请求,处理业务逻辑的函数:46.......
  • 手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码
    前言今天和大家一起分享如何使用LabVIEW调用pb模型实现物体识别,本博客中使用的智能工具包可到主页置顶博客LabVIEWAI视觉工具包(非NIVision)下载与安装教程中下载一、物......
  • Argo CD系列视频图文版之数据加密
    配套视频往期回顾1.​​ArgoCD系列之初识ArgoCD​​2.​​ArgoCD系列之ArgoCD环境搭建​​3.​​ArgoCD系列之安装ArgoCD​​4.​​ArgoCD系列之自建应用模拟开发场......