编程笔记 Golang基础 042 文件处理
编程笔记 Golang基础 042 文件处理
- 一、文件处理
- 二、Go语言文件处理
- 创建文件和写入内容
- 打开文件并按模式读写
- 读取文件内容
- 更高级的文件和IO操作
- 改变文件权限
- 目录操作
- 小结
一、文件处理
文件处理是指在计算机科学中,对存储在磁盘或其他持久性存储介质上的文件进行的一系列操作。这包括但不限于以下几个方面:
-
文件的创建:创建新的文件,为后续的数据存储做好准备。
-
文件的打开与关闭:通过系统调用或编程语言提供的API打开已存在的文件或者新建的文件,获取一个指向文件的引用(文件描述符或文件句柄),之后在完成文件操作后,正确地关闭文件以释放系统资源。
-
文件读取:从文件中读取数据,可以是字符、字符串、整数或其他数据类型,按照设定的编码或格式解析内容。
-
文件写入:将数据写入文件,可以是覆盖原有内容,也可以是追加到文件末尾。
-
文件定位:通过移动文件指针,实现对文件内特定位置的读写操作。
-
文件删除:移除不再需要的文件。
-
文件属性修改:改变文件的访问权限、所有权、时间戳(如最后访问时间、最后修改时间)等元数据。
-
文件复制与移动:在磁盘的不同位置之间复制或移动文件。
-
文件搜索与目录遍历:查找特定名称或类型的文件,在目录结构中导航。
-
文件压缩与解压缩:对文件进行压缩节省存储空间或传输时的数据量,解压缩还原原始文件。
在具体编程实践中,例如在Go语言中,上述操作可以通过标准库中的os
和io
等包提供的函数来实现。例如,使用os.Open
、os.Create
、os.ReadFile
、os.WriteFile
等函数来进行相应的文件处理任务。同时,针对大文件操作和高效读写,还可以利用bufio
等额外的库来优化性能。
二、Go语言文件处理
在 Go 语言中,文件处理涉及到创建、读取、写入、追加、关闭文件以及更改文件权限等多种操作。以下是一些关键概念和函数的详解:
创建文件和写入内容
import ("io/ioutil""os"
)// 使用 ioutil 包一次性创建并写入文件内容
func writeToFile(filename string, content []byte, perm os.FileMode) error {return ioutil.WriteFile(filename, content, perm)
}// 示例:
data := []byte("Hello, World!")
err := writeToFile("output.txt", data, 0644) // 默认权限为 0644,意味着所有者可读写,其他人可读
if err != nil {panic(err)
}
打开文件并按模式读写
import ("os"
)// 使用 os 包打开文件
func openFile(filename string, flag int, perm os.FileMode) (*os.File, error) {return os.OpenFile(filename, flag, perm)
}// 示例:
file, err := openFile("input.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {panic(err)
}
defer file.Close() // 记得在完成操作后关闭文件// 写入内容
_, err = file.WriteString("Some text to write")
if err != nil {panic(err)
}// 若要追加内容而不是覆盖文件,应使用如下模式:
// _, err = openFile("input.txt", os.O_APPEND|os.O_WRONLY, 0644)
读取文件内容
import ("io/ioutil"
)// 使用 ioutil 包读取文件全部内容
func readFile(filename string) ([]byte, error) {return ioutil.ReadFile(filename)
}// 示例:
content, err := readFile("input.txt")
if err != nil {panic(err)
}
fmt.Println(string(content))
更高级的文件和IO操作
对于更复杂的文件操作,可能需要用到 bufio
(带缓冲的读写)、io.Reader
和 io.Writer
接口,以及 ioutil.ReadAll
、bufio.NewScanner
等函数。
改变文件权限
import ("os"
)// 改变文件权限
func changePermissions(filename string, mode os.FileMode) error {return os.Chmod(filename, mode)
}// 示例:
err := changePermissions("output.txt", 0755)
if err != nil {panic(err)
}
目录操作
除了文件外,Go 还提供了对目录进行操作的函数,如 os.Mkdir
创建目录,os.RemoveAll
删除文件或目录,os.ReadDir
列出目录内容等。
以上只是文件处理的基本操作,实际使用时请务必处理好错误并适时关闭文件以释放资源。在处理大量数据或进行高性能文件 I/O 操作时,推荐使用 bufio
和 io
库提供的流式读写方式以提高效率。
小结
Go 语言文件处理具有以下特点,总结一下。
-
简洁的API设计:
Go 语言的标准库os
提供了一系列简单直接的函数用于文件操作,如Open
、Create
、Read
、Write
、Close
等,使得文件系统的交互直观易懂。 -
零值安全:
Go 语言的文件操作遵循其零值安全的设计理念,如果尝试对未打开的文件执行读写操作,编译器不会通过编译,而在运行时也会抛出异常,强制开发者合理地管理文件状态。 -
错误处理:
Go 语言强调错误处理的重要性,所有的文件操作都可能会返回一个错误,要求开发者明确地处理这些潜在的错误情况,从而避免因文件操作失败导致的问题。 -
可读性强:
Go 语言鼓励简洁的代码风格,通过上下文感知的defer
语句,可以确保文件在操作完成后会被正确关闭,即使在发生错误的情况下也能保证资源的释放。 -
异步I/O支持:
虽然标准库中的文件操作通常是同步的,但 Go 也提供了如io/ioutil
包的一些便捷函数,以及io.Pipe
和io.Copy
等可用于构建异步文件处理流水线的方法。 -
操作系统无关性:
Go 语言的文件系统 API 设计为高度可移植的,可以在多种操作系统上正常工作,只需根据目标平台调用适当的函数即可,无需关心底层细节。 -
文件权限管理:
Go 语言提供了设置和修改文件权限的函数,如os.Chmod
,能够确保文件安全性,符合不同场景下的权限需求。 -
目录操作支持:
不仅支持文件操作,还提供了诸如创建、删除、遍历目录等功能,便于进行更复杂的文件系统管理。 -
高效内存管理:
通过bufio
包可以实现高效的文件读写,减少内存分配次数,提升大规模文件操作的性能。
总结来说,Go 语言在文件处理方面结合了简单的接口设计、严格的错误处理机制和良好的跨平台兼容性,同时还考虑到了资源管理、性能优化等实用需求,非常适合进行各种复杂程度的文件系统操作。
相关文章:
编程笔记 Golang基础 042 文件处理
编程笔记 Golang基础 042 文件处理 一、文件处理二、Go语言文件处理创建文件和写入内容打开文件并按模式读写读取文件内容更高级的文件和IO操作改变文件权限目录操作 小结 一、文件处理 文件处理是指在计算机科学中,对存储在磁盘或其他持久性存储介质上的文件进行的…...

linuxlsof详解
lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息,我们都知道,在Linux中,一切皆文件,lsof命令可以查看所有已经打开了的文件,比如: 普通文件,目录,特殊的块文件,…...
学习JAVA的第十二天(基础)
目录 算法 查找算法 基本查找(顺序查找) 二分查找(折半查找) 分块查找 排序算法 冒泡排序 选择排序 插入排序 快速排序 递归算法 算法 算法(Algorithm)是指解题方案的准确而完整的描述ÿ…...

Vector集合源码分析
Vector集合源码分析 文章目录 Vector集合源码分析一、字段分析二、方法分析三、总结 内容如有错误或者其他需要注意的知识点,欢迎指正或者探讨补充,共同进步。 一、字段分析 //用于存储该集合中的所有数据对象,所以是基于数组实现的 protec…...
Unity引擎中光源都有哪几种,都有什么作用
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com Unity 引擎为了实现游戏场景的明暗和光影效果,提供了四种类型的光源,分别是方向光(Directional Lights)、点光源(Point Lights)、聚光灯…...
C语言中结构体成员访问操作符的含义及其用法
1.直接访问操作符 用法:结构体名.成员名。 含义:直接访问结构体中的成员变量。 示例: #include<stdio.h> struct student {char name[20];int age; }; int main() {//定义了一个结构体数组arrstruct student arr[4] { {"cxk&q…...
Kubeadmin方式部署Calico网络模式的K8s集群
目录 1.环境准备 2.配置内核参数 3.配置ntp时间服务器 4.配置持久化日志目录 5.升级物理机内核 6.配置ipvs服务 7.安装docker 8.安装kubeadm、kubectl、kubelet 9.导入k8s组件基础镜像 10.k8s初始化配置 11.配置calico网络 12.完成部署 1.环境准备 ###方案中涉及的…...

sparse transformer 常见稀疏注意力
参考: https://zhuanlan.zhihu.com/p/259591644 主要就是降低transformer自注意力模块的复杂度 复杂度主要就是 Q K^T影响的,稀疏注意力就是在Q点乘K的转置这模块做文章 下列式一些sparse transformer稀疏注意力方法 a、transformer原始的 ࿰…...

力扣 第 125 场双周赛 解题报告 | 珂学家 | 树形DP + 组合数学
前言 整体评价 T4感觉有简单的方法,无奈树形DP一条路上走到黑了,这场还是有难度的。 T1. 超过阈值的最少操作数 I 思路: 模拟 class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x <…...

基于springboot+vue的人格障碍诊断系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

Go-知识struct
Go-知识struct 1. struct 的定义1.1 定义字段1.2 定义方法 2. struct的复用3. 方法受体4. 字段标签4.1 Tag是Struct的一部分4.2 Tag 的约定4.3 Tag 的获取 githupio地址:https://a18792721831.github.io/ 1. struct 的定义 Go 语言的struct与Java中的class类似&am…...

SpringMVC 学习(十一)之数据校验
目录 1 数据校验介绍 2 普通校验 3 分组校验 4 参考文档 1 数据校验介绍 在实际的项目中,一般会有两种校验数据的方式:客户端校验和服务端校验 客户端校验:这种校验一般是在前端页面使用 JS 代码进行校验,主要是验证输入数据…...

软考55-上午题-【数据库】-数据库设计步骤1
一、数据库设计的步骤 新奥尔良法,四个主要阶段: 1、用户需求分析:手机用户需求,确定系统边界; 2、概念设计(概念结构设计):是抽象概念模型,较理想的是采用E-R方法。 …...
速盾:使用cdn后速度慢是怎么回事?
CDN(内容分发网络)是一种通过将网站的静态内容分布到全球各地的服务器,从而提供更快速度和更好用户体验的技术。然而,有时候用户会遇到使用CDN后速度变慢的问题,下面将探讨几种可能的原因。 服务器选择错误: CDN服务通…...

考研复试类比社团招新,无所谓“公平”,导师选谁都是他的权力
这篇文章是抖音和b站上上传的同名视频的原文稿件,感兴趣的csdn用户可以关注我的抖音和b站账号(GeekPower极客力量)。同时这篇文章也为视频观众提供方便,可以更加冷静地分析和思考。文章同时在知乎发表。 我考研一战的时候计算机考…...
阿里面试,有点焦虑。。
恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经,目前已更新至美团、字节… 作者TechGuide【全网同名】 聊聊春招 春招来了,有些24届校招生可能还在做最后的努力,有些25届的…...
24计算机考研调剂 | 石家庄铁道大学
01石家庄铁道大学 智慧交通研究室招少量调剂学术型硕士(数一英一320分以上工科专业) 考研调剂招生信息 学校:石家庄铁道大学 专业:工学->计算机科学与技术->计算机应用技术 工学->测绘科学与技术->地图制图学与地理信息工程 工学->交…...

勇敢尝鲜之Springboot3大坑-集成Mybatisplus报错:ddlApplicationRunner
🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…...

linux高级编程:线程(二)、进程间的通信方式
线程: 回顾线程(一): 1.线程间通信问题 线程间共享同一个资源(临界资源) 互斥: 排他性访问 linux系统 -- 提供了Posix标准的函数库 -- 互斥量(互斥锁) 原子操作&#x…...

Unity 佳能SDK 及数据获取
1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你 佳能(中国)- 佳定制(佳能影像产品),SDK,EDSDK,CCAPI,软件开发包下载 2. 将SDK这两个文件放到 Unity Plugins文件夹 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...