GO系列-IO 文件操作

os io

判断文件是否存在

func fileExist(filePath string) (bool, error) {
    _, err := os.Stat(filePath)
    if err == nil {
       return true, nil
    }

    if os.IsNotExist(err) {
       return false, nil
    }
    return false, &CheckFileExistError{filePath}
}

读取文件内容

func readFileContext(file *os.File) (string, error) {
    if file == nil {
       return "", nil
    }

    var buf [1024]byte
    var content []byte
    for {
       n, err := file.Read(buf[:])
       if err == io.EOF {
          //结尾
          break
       } else if err != nil {
          log.Println("Read file error", file.Name())
          return "", err
       }

       content = append(content, buf[:n]...)
    }
    return string(content), nil
}

创建文件&写入文件内容

// 如果不存在 则创建
if !exist {
    log.Println("create file:", filePath)
    newFile, err := os.Create(filePath)
    if err != nil {
       log.Panicln(err.Error())
    }
    // 写入文件
    newFile.WriteString("Hello word !!!\n")
    newFile.Write([]byte("happy every day\n"))
    newFile.Close()
}

打开文件

// 打开这个文件
file1, err := os.Open(filePath)
if err != nil {
    log.Panicln(err.Error())
}

关闭和删除文件

// 删除前关闭文件,否则报错
file1.Close()

// 删除文件
stat1, _ := file1.Stat()
if stat1 != nil {
    log.Println("file is not closed")
}
err = os.Remove(filePath)
if err != nil {
    log.Println("remove file error", filePath, err.Error())
}
log.Println("remove file success", filePath)

copy文件

func copyFile(filePath1 string, filePath2 string) error {
    exist, err := fileExist(filePath1)
    if err != nil {
       return err
    }

    if !exist {
       log.Println("file1 must exist ")
       return nil
    }

    file1, err := os.Open(filePath1)
    if err != nil {
       log.Println("open file1 error")
       return err
    }
    defer file1.Close()

    // 如果存在则删除
    exist, err = fileExist(filePath2)
    if err != nil {
       return err
    }
    if exist {
       os.Remove(filePath2)
    }

    file2, err := os.Create(filePath2)
    if err != nil {
       log.Println("create file2 error")
       return err
    }
    defer file2.Close()

    var buffer [1024]byte
    for {
       n, err := file1.Read(buffer[:])
       if err == io.EOF {
          log.Println("copy complete")
          break
       }
       if err != nil {
          log.Println("copy error")
          return err
       }
       file2.Write(buffer[:n])
    }

    return nil
}

综合示例

package main

import (
    "io"
    "log"
    "os"
)

type CheckFileExistError struct {
    FilePath string
}

func (err CheckFileExistError) Error() string {
    return "Check File[" + err.FilePath + "] Exist Error"
}

func fileExist(filePath string) (bool, error) {
    _, err := os.Stat(filePath)
    if err == nil {
       return true, nil
    }

    if os.IsNotExist(err) {
       return false, nil
    }
    return false, &CheckFileExistError{filePath}
}

func readFileContext(file *os.File) (string, error) {
    if file == nil {
       return "", nil
    }

    var buf [1024]byte
    var content []byte
    for {
       n, err := file.Read(buf[:])
       if err == io.EOF {
          //结尾
          break
       } else if err != nil {
          log.Println("Read file error", file.Name())
          return "", err
       }

       content = append(content, buf[:n]...)
    }
    return string(content), nil
}

func copyFile(filePath1 string, filePath2 string) error {
    exist, err := fileExist(filePath1)
    if err != nil {
       return err
    }

    if !exist {
       log.Println("file1 must exist ")
       return nil
    }

    file1, err := os.Open(filePath1)
    if err != nil {
       log.Println("open file1 error")
       return err
    }
    defer file1.Close()

    // 如果存在则删除
    exist, err = fileExist(filePath2)
    if err != nil {
       return err
    }
    if exist {
       os.Remove(filePath2)
    }

    file2, err := os.Create(filePath2)
    if err != nil {
       log.Println("create file2 error")
       return err
    }
    defer file2.Close()

    var buffer [1024]byte
    for {
       n, err := file1.Read(buffer[:])
       if err == io.EOF {
          log.Println("copy complete")
          break
       }
       if err != nil {
          log.Println("copy error")
          return err
       }
       file2.Write(buffer[:n])
    }

    return nil
}

func main() {
    log.Println("main ...")

    filePath := "./test.txt"
    filePath2 := "./test2.txt"

    exist, err := fileExist(filePath)
    log.Println("file ", filePath, "exist:", exist)
    if err != nil {
       log.Println(err.Error())
    }

    // 如果不存在 则创建
    if !exist {
       log.Println("create file:", filePath)
       newFile, err := os.Create(filePath)
       if err != nil {
          log.Panicln(err.Error())
       }
       // 写入文件
       newFile.WriteString("Hello word !!!\n")
       newFile.Write([]byte("happy every day\n"))
       newFile.Close()
    }

    // 打开这个文件
    file1, err := os.Open(filePath)
    if err != nil {
       log.Panicln(err.Error())
    }

    // 读取文件原始内容
    context, err := readFileContext(file1)
    if err != nil {
       log.Panicln(err.Error())
    }
    log.Println("context:", context)

    // 删除前关闭文件,否则报错
    file1.Close()

    // copy文件
    copyFile(filePath, filePath2)

    // 删除文件
    stat1, _ := file1.Stat()
    if stat1 != nil {
       log.Println("file is not closed")
    }
    err = os.Remove(filePath)
    if err != nil {
       log.Println("remove file error", filePath, err.Error())
    }
    log.Println("remove file success", filePath)

    log.Println("success ..")
}

bufio

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

bufio缓冲写数据

模式       含义

os.O_WRONLY     只写

os.O_CREATE      创建文件

os.O_RDONLY      只读

os.O_RDWR   读写

os.O_TRUNC 清空

os.O_APPEND      追加

package main

import (
    "bufio"
    "io"
    "log"
    "os"
)

// 写文件
func write(filePath string) {
    // 参数2:打开模式,所有模式d都在上面
    // 参数3是权限控制
    // w写 r读 x执行   w  2   r  4   x  1
    file, err := os.OpenFile(filePath, 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 read(filePath string) string {
    file, err := os.Open(filePath)
    if err != nil {
       return ""
    }
    defer file.Close()
    var content []byte
    reader := bufio.NewReader(file)
    for {
       line, _, err := reader.ReadLine()
       if err == io.EOF {
          break
       }
       if err != nil {
          return ""
       }
       content = append(content, []byte(string(line)+"\n")...)
    }
    return string(content)
}

func main() {
    log.Println("main ...")

    filePath := "./test1.txt"
    write(filePath)
    content := read(filePath)
    log.Println(content)

    log.Println("success ..")
}

ioutil

package main

import (
    "io/ioutil"
    "log"
)

func main() {
    log.Println("main ...")

    filePath := "./test1.txt"
    // 写文件
    err := ioutil.WriteFile(filePath, []byte("hello word"), 0666)
    if err != nil {
       log.Println(err)
       return
    }

    // 读取文件
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
       log.Println(err)
       return
    }
    log.Println(string(content))

    log.Println("success ..")
}

控制台输入输出

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

os.Stdin:标准输入的文件实例,类型为*File

os.Stdout:标准输出的文件实例,类型为*File

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

以文件的方式操作终端:

package main

import (
    "log"
    "os"
)

func main() {
    log.Println("main ...")

    var buf [16]byte
    // 从控制台读取一行数据
    os.Stdin.Read(buf[:])
    log.Println("read context:", string(buf[:]))

    // 写入到控制台
    os.Stdout.WriteString("hello word\n")

    log.Println("success ..")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

23. AI-大语言模型-DeepSeek简介

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本1. 类型2. 版本3. 参数规模与模型能力 3. 特征4. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文…

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…

Linux 驱动入门(6)—— IRDA(红外遥控模块)驱动

文章目录 一、编译替换内核和设备树二、IRDA&#xff08;红外遥控模块&#xff09;1. 红外遥控简介2. 红外遥控器协议3. 编程思路 三、驱动代码1. GPIO 实现1.1 驱动层代码1.2 应用层代码 2. 设备树实现2.1 修改设备树2.2 驱动层代码2.3 应用层代码 3. 上机测试 一、编译替换内…

hot100_139. 单词拆分

hot100_139. 单词拆分 思路 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入:…

ath9k(Atheros芯片)开源驱动之wifi连接

为什么会推荐这个wifi 驱动进行学习&#xff1f; ath9k&#xff08;Atheros芯片&#xff09;&#xff1a;代码结构清晰&#xff0c;适合学习实践 为什么我只在开篇写了一个wifi连接的操作&#xff1f; 先让一个开源驱动在你的硬件上跑起来&#xff0c;再逐步修改&#xff0c…

win10把c盘docker虚拟硬盘映射迁移到别的磁盘

c盘空间本身就比较小、如果安装了docker服务后&#xff0c;安装的时候没选择其他硬盘&#xff0c;虚拟磁盘也在c盘会占用很大的空间&#xff0c;像我的就三十多个G&#xff0c;把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…

PHP课程预约小程序源码

&#x1f4f1; 课程预约小程序&#xff1a;为您专属定制的便捷预约新体验 在这个快节奏的时代&#xff0c;我们深知每一位瑜伽爱好者、普拉提追随者以及培训机构管理者对高效、便捷服务的迫切需求。因此&#xff0c;我们匠心独运&#xff0c;推出了一款基于PHPUniApp框架开发的…

Docker实战-使用docker compose搭建博客

docker run 部署 创建blog网络 [rootk8s-master ~]# docker network create blog 8f533a5a1ec65eae3f98c0ae5a76014a3ab1bf3c087ad952cdc100cc7a658948 [rootk8s-master ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 8f533a5a1ec6 blog bridge …

javaEE-SpringBoot日志

一.日志的用途 平时我们使用日志,就是通过控制台打印一些信息,或者程序运行保存,查看控制台报错原因. 随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题. ⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤…

DeepSeek vs ChatGPT:AI 领域的华山论剑,谁主沉浮?

一、引言 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已然成为推动各领域变革的核心力量。而在人工智能的众多分支中&#xff0c;自然语言处理&#xff08;NLP&#xff09;因其与人类日常交流和信息处理的紧密联系&#xff0c;成为了最受瞩目的领…

LangChain-基础(prompts、序列化、流式输出、自定义输出)

LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的&#xff0c;它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题&#xff0c;解决这个问题有2种解决方案 基于现有的大模型上进行微调&#xff0c;使得它能适应这些问题&#xff08;本…

数据库面试知识点总结

目录 1. MySQL 基础题1.1 执行⼀条 select / update 语句&#xff0c;在 MySQL 中发生了什么&#xff1f;1.2 MySQL 一行记录是怎么存储的&#xff1f; 2. 三大范式3. 数据库引擎3.1 Innodb3.2 MyISAM 4. 数据库索引4.1 索引分类4.2 索引优缺点4.3 索引使用场景4.4 优化索引方法…

Spring事务原理 二

在上一篇博文《Spring事务原理 一》中&#xff0c;我们熟悉了Spring声明式事务的AOP原理&#xff0c;以及事务执行的大体流程。 本文中&#xff0c;介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中&#xff0c;我们将结合案例&#xff0c;来讲解实战中有关事务的易…

使用 C++ 和 gRPC 的常见陷阱及解决方案

文章目录 1. 环境配置的陷阱1.1 依赖版本冲突或混淆1.2 gRPC 工具缺失 2. 编译和链接的陷阱2.1 运行时库不匹配&#xff08;/MT vs /MD&#xff09;2.2 未解析的外部符号 3. Protobuf 文件生成的陷阱3.1 工具版本不匹配3.2 生成文件运行时库不一致 4. 运行时的陷阱4.1 缺少 DLL…

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类

《深度学习实战》第2集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;与图像分类 引言 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer&#xf…

创建Linux虚拟环境并远程连接

目录 下载VMware软件 下载CentOS 创建虚拟环境 远程连接Linux系统 下载VMware软件 不会的可以参考 传送门 下载CentOS 不会的可以参考 传送门 创建虚拟环境 打开VMware软件&#xff0c;创建虚拟机 选择典型安装 找到我们安装好的centOS文件&#xff0c;之后会自动检…

RV1126解码(5) read_vdec_thread线程

read_vdec_thread线程的用处 read_vdec_thread线程主要是获取每一帧VDEC解码数据&#xff0c;并打印出来每一帧数据的具体信息。 代码&#xff1a; //用于从 VDEC 解码器获取每一帧解码后的图像数据 void *read_vdec_thread(void *args) {pthread_detach(pthread_self());MED…

verilog笔记

Verilog学习笔记&#xff08;一&#xff09;入门和基础语法BY电棍233 由于某些不可抗拒的因素和各种的特殊原因&#xff0c;主要是因为我是微电子专业的&#xff0c;我需要去学习一门名为verilog的硬件解释语言&#xff0c;由于我是在某西部地区的神秘大学上学&#xff0c;这所…

Three.js 快速入门教程【六】相机控件 OrbitControls

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域&#xff0c;数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD&#xff08;Controller Area Network Flexible Data Rate&#xff09;芯片&#xff0c;以高安全、高可靠、断电…