编程笔记 Golang基础 042 文件处理

编程笔记 Golang基础 042 文件处理

  • 一、文件处理
  • 二、Go语言文件处理
    • 创建文件和写入内容
    • 打开文件并按模式读写
    • 读取文件内容
    • 更高级的文件和IO操作
    • 改变文件权限
    • 目录操作
  • 小结

一、文件处理

文件处理是指在计算机科学中,对存储在磁盘或其他持久性存储介质上的文件进行的一系列操作。这包括但不限于以下几个方面:

  1. 文件的创建:创建新的文件,为后续的数据存储做好准备。

  2. 文件的打开与关闭:通过系统调用或编程语言提供的API打开已存在的文件或者新建的文件,获取一个指向文件的引用(文件描述符或文件句柄),之后在完成文件操作后,正确地关闭文件以释放系统资源。

  3. 文件读取:从文件中读取数据,可以是字符、字符串、整数或其他数据类型,按照设定的编码或格式解析内容。

  4. 文件写入:将数据写入文件,可以是覆盖原有内容,也可以是追加到文件末尾。

  5. 文件定位:通过移动文件指针,实现对文件内特定位置的读写操作。

  6. 文件删除:移除不再需要的文件。

  7. 文件属性修改:改变文件的访问权限、所有权、时间戳(如最后访问时间、最后修改时间)等元数据。

  8. 文件复制与移动:在磁盘的不同位置之间复制或移动文件。

  9. 文件搜索与目录遍历:查找特定名称或类型的文件,在目录结构中导航。

  10. 文件压缩与解压缩:对文件进行压缩节省存储空间或传输时的数据量,解压缩还原原始文件。

在具体编程实践中,例如在Go语言中,上述操作可以通过标准库中的osio等包提供的函数来实现。例如,使用os.Openos.Createos.ReadFileos.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.Readerio.Writer 接口,以及 ioutil.ReadAllbufio.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 操作时,推荐使用 bufioio 库提供的流式读写方式以提高效率。

小结

Go 语言文件处理具有以下特点,总结一下。

  1. 简洁的API设计
    Go 语言的标准库 os 提供了一系列简单直接的函数用于文件操作,如 OpenCreateReadWriteClose 等,使得文件系统的交互直观易懂。

  2. 零值安全
    Go 语言的文件操作遵循其零值安全的设计理念,如果尝试对未打开的文件执行读写操作,编译器不会通过编译,而在运行时也会抛出异常,强制开发者合理地管理文件状态。

  3. 错误处理
    Go 语言强调错误处理的重要性,所有的文件操作都可能会返回一个错误,要求开发者明确地处理这些潜在的错误情况,从而避免因文件操作失败导致的问题。

  4. 可读性强
    Go 语言鼓励简洁的代码风格,通过上下文感知的 defer 语句,可以确保文件在操作完成后会被正确关闭,即使在发生错误的情况下也能保证资源的释放。

  5. 异步I/O支持
    虽然标准库中的文件操作通常是同步的,但 Go 也提供了如 io/ioutil 包的一些便捷函数,以及 io.Pipeio.Copy 等可用于构建异步文件处理流水线的方法。

  6. 操作系统无关性
    Go 语言的文件系统 API 设计为高度可移植的,可以在多种操作系统上正常工作,只需根据目标平台调用适当的函数即可,无需关心底层细节。

  7. 文件权限管理
    Go 语言提供了设置和修改文件权限的函数,如 os.Chmod,能够确保文件安全性,符合不同场景下的权限需求。

  8. 目录操作支持
    不仅支持文件操作,还提供了诸如创建、删除、遍历目录等功能,便于进行更复杂的文件系统管理。

  9. 高效内存管理
    通过 bufio 包可以实现高效的文件读写,减少内存分配次数,提升大规模文件操作的性能。

总结来说,Go 语言在文件处理方面结合了简单的接口设计、严格的错误处理机制和良好的跨平台兼容性,同时还考虑到了资源管理、性能优化等实用需求,非常适合进行各种复杂程度的文件系统操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Jni添加打印(C++打印)

Android Jni添加打印(C打印) 文章目录 Android Jni添加打印(C打印)一、前言二、添加日志实现1、在某个类上面定义类型和方法2、把日志方法定义在.h文件中定义 myLog.h3、引用打印头文件的示例代码(1) MainA…

【详识JAVA语言】面向对象程序三大特性之三:多态

多态 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 多态实现条件 在java中要实现多态,必须要满足如下几个条件,缺一不可&#xf…

循环队列与循环双端队列

文章目录 前言循环队列循环双端队列 前言 1、学习循环队列和循环双端队列能加深我们对队列的理解,提高我们的编程能力。 2、本文循环队列使用的是数组,循环双端队列用的是双向链表 3、题目连接:设计循环队列 ,设计循环双端队列。 …

【机器学习】有监督学习算法之:支持向量机

支持向量机 1、引言2、决策树2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝:鱼哥,泡澡啊。 小鱼:不去 小屌丝:… 此话当真? 小鱼:此话不假 小屌丝:到底去还是…

Linux 网络接口的混杂模式(Promiscuous mode)认知

写在前面 博文内容为 混杂模式的简单认知理解不足小伙伴帮忙指正 认定一件事,即使拿十分力气都无法完成,也要拿出十二分力气去努力。 —《剑来》 网络接口的混杂模式 混杂模式(Promiscuous mode),简称 Promisc mode,俗称监听模式…

什么是支持向量机(Support vector machine)和其原理

作为机器学习的基础算法,SVM被反复提及,西瓜书、wiki都能查到详细介绍,但是总是觉得还差那么点,于是决定自己总结一下。 一、什么是SVM? 1、解决什么问题? SVM,最原始的版本是用于最简单的线…

蓝桥杯备赛第五篇(动态规划)

1.数位dp public class Main {static long[] limit;static int length;static long[][] dp;public static long dfs(int pos, int pre, boolean flag, boolean lead) {if (pos length) return 1;if (!flag && !lead && dp[pos][pre] ! -1) return dp[pos][pr…

总结 HashTable, HashMap, ConcurrentHashMap 之间的区别

1.多线程环境使用哈希表 HashMap 不行,线程不安全 更靠谱的,Hashtable,在关键方法上加了synchronized 后来标准库又引入了一个更好的解决方案;ConcurrentHashMap 2.HashMap 首先HashMap本身线程不安全其次HashMap的key值可以为空(当key为空时,哈希会…

【Java数据结构】——五道算法题让你灵活运用Map和Set

目录 一.只出现一次的数字 二.宝石与石头 三.旧键盘 四.给定一个数组,统计每个元素出现的次数 五.前K个高频单词 一.只出现一次的数字 136. 只出现一次的数字 - 力扣(LeetCode) 算法原理:我们将nums中每个元素都存入到set中…

C/C++嵌入式开发环境搭建,Qt交叉编译,cmake交叉编译,clion/vscode远程开发

目录 交叉编译简介cmake 交叉编译clion 交叉编译vscode 远程嵌入式开发Qt交叉编译1.安装交叉编译工具2.交叉编译qt库3.将交叉编译的Qt库复制到板子上4.安装和配置 Qt Creator,支持交叉编译5.QT嵌入式开发6.QT嵌入式开发报错解决QIconvCodec::convertToUnicode: usin…

ASUS华硕天选5笔记本电脑FX607JV原装出厂Win11系统下载

ASUS TUF Gaming F16 FX607JV天选五原厂Windows11系统 适用型号: FX607JU、FX607JI、FX607JV、 FX607JIR、FX607JVR、FX607JUR 下载链接:https://pan.baidu.com/s/1l963wqxT0q1Idr98ACzynQ?pwd0d46 提取码:0d46 原厂系统自带所有驱动、…

TypeScript中 “ <> “ 语法 和 “ : “ 怎么使用

在 TypeScript 中&#xff0c;尖括号语法(<Type>)和as关键字(value as Type)都是用于类型断言&#xff0c;而冒号(:)用于类型注解。这三种语法在不同的场景下使用&#xff1a; 尖括号语法和as关键字&#xff1a; 尖括号语法(<Type>value)&#xff1a; 这种语法在…

[LeetBook]【学习日记】链表反转

来源于「Krahets」的《图解算法数据结构》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/ 链表反转的递归要点 递归终止条件为当前节点为空&#xff0c;表明遍历到了链表尾部递归函数传入参数为当前节点的下一个节点按照是否重新开辟存储空间分类下面只写…

python自动化学习--3.8python操作EXCEL文件python日志收集处理

1、Excel文件处理 安装 openpxl 第三方库 openpxl 模块三大组件: 1、工作簿 &#xff08;包含多个sheet工作表&#xff09; 2、工作表 &#xff08;某个数据包含在某个工作表&#xff09; 3、单元格 1、创建excel工作簿 import openpyxl"""Excel表格的创建…

【简说八股】Spring事务失效可能是哪些原因?

Spring事务介绍 Spring事务是指在Spring框架中对数据库操作进行管理的一种机制&#xff0c;它确保一组数据库操作要么完全执行成功&#xff08;提交&#xff09;&#xff0c;要么完全不执行&#xff08;回滚&#xff09;&#xff0c;从而保持数据一致性和完整性。 Spring框架…

GotoXy控制台光标的位置更新

光标控制解释 控制台的光标更新方法, 用于控制数据输出位置 void gotoXY(int x, int y)//新函数&#xff1a;更新光标 {COORD c;c.X x;c.Y y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }代码解释 这段代码定义了一个名为 gotoXY 的函数&#xff0c;…

设计模式-装饰者模式应用实践

装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许动态地向一个现有的对象添加新的功能&#xff0c;同时不改变其结构。这种模式通过创建一个装饰类来包装原有的类&#xff0c;提供额外的行为。 下面是一个使用 Java 实现装饰者模式…

【Spring Boot】实现全局异常处理

1.定义基础异常接口类 /*** description: 服务接口类* author: MrVK* date: 2021/4/19 21:39*/ public interface BaseErrorInfoInterface {/*** 错误码* return*/String getResultCode();/*** 错误描述* return*/String getResultMsg(); } 2.定义错误处理枚举类 /*** desc…

小伙伴询问AI该怎么学习?本人的一点总结,以思维导图呈现

如有需要思维导图的在后台请留邮箱&#xff0c;相关知识结构目录 部分导图

nn.Linear() 使用提醒

原本以为它是和nn.Conv2d()一样&#xff0c;就看第二个维度的数值&#xff0c;今天才知道&#xff0c;它是只看最后一个维度的数值&#xff01;&#xff01;&#xff01; 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…