广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言IO操作输入输出底层原理及文件操作API
  • 299
分享到

Go语言IO操作输入输出底层原理及文件操作API

GoIO操作输入输出APIGoIOAPI 2023-01-08 12:01:29 299人浏览 八月长安
摘要

目录1.输入输出的底层原理2. 文件操作相关api3. 打开和关闭文件4. 写文件5. 读文件6. 拷贝文件7. bufio1.输入输出的底层原理 终端其实是一个文件,相关实例如下

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()
}

以上就是Go语言IO操作输入输出底层原理及文件操作API的详细内容,更多关于Go IO操作输入输出API的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言IO操作输入输出底层原理及文件操作API

本文链接: https://www.lsjlt.com/news/177077.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言IO操作输入输出底层原理及文件操作API
    目录1.输入输出的底层原理2. 文件操作相关API3. 打开和关闭文件4. 写文件5. 读文件6. 拷贝文件7. bufio1.输入输出的底层原理 终端其实是一个文件,相关实例如下...
    99+
    2023-01-08
    Go IO操作输入输出API Go IO API
  • 如何用 C 语言来进行文件输入输出操作
    本篇内容主要讲解“如何用 C 语言来进行文件输入输出操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用 C 语言来进行文件输入输出操作”吧!如果你打算学习 C 语言的输入、输出,可以从&n...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作