Elixir学习笔记——输入输出和文件系统

本章介绍输入/输出机制、文件系统相关任务以及相关模块(如 IO、File 和 Path)。IO 系统提供了一个很好的机会来阐明 Elixir 和 Erlang VM 的一些思维模式和新奇思想。

输入输出模块

输入输出模块是 Elixir 中读写标准输入/输出 (:stdio)、标准错误 (:stderr)、文件和其他输入输出设备的主要机制。该模块的使用非常简单:

默认情况下,输入输出模块中的函数从标准输入读取并写入标准输出。我们可以通过传递 :stderr 作为参数(以便写入标准错误设备)来更改此设置:

文件模块

文件模块包含允许我们将文件作为输入输出设备打开的函数。默认情况下,文件以二进制模式打开,这要求开发人员使用输入输出模块中的特定 IO.binread/2 和 IO.binwrite/2 函数:

潜在数据丢失警告
以下代码打开一个文件进行写入。如果给定路径上有现有文件,则将删除其内容。

可以使用 :append 选项而不是 :write 打开文件以保留其内容。您还可以传递 :utf8 选项,该选项告诉 File 模块将从文件读取的字节解释为 UTF-8 编码的字节。

除了用于打开、读取和写入文件的函数外,File 模块还有许多用于文件系统的函数。这些函数以它们的 UNIX 等效函数命名。例如,File.rm/1 可用于删除文件,File.mkdir/1 可用于创建目录,File.mkdir_p/1 可用于创建目录及其所有父链。甚至还有 File.cp_r/2 和 File.rm_rf/1 分别用于递归复制和删除文件和目录(即,也复制和删除目录的内容)。

您还会注意到 File 模块中的函数有两种变体:一种是“常规”变体,另一种是带有尾随感叹号 (!) 的变体。例如,当我们读取上面示例中的“hello”文件时,我们使用 File.read/1。或者,我们可以使用 File.read!/1:

请注意,带有 ! 的版本返回文件的内容而不是元组,如果出现任何问题,该函数会引发错误。

没有 ! 的版本当您想使用模式匹配处理不同的结果时,是首选:

但是,如果您希望文件在那里,则感叹号变体更有用,因为它会引发有意义的错误消息。避免写:

因为,如果发生错误,File.read/1 将返回 {:error,reason},并且模式匹配将失败。您仍将获得所需的结果(引发错误),但消息将与不匹配的模式有关(因此对于错误的具体含义却一无所知)。

因此,如果您不想处理错误结果,请优先使用以感叹号结尾的函数,例如 File.read!/1。

路径模块

文件模块中的大多数函数都要求将路径作为参数。最常见的是,这些路径将是常规二进制文件。路径模块提供了处理此类路径的功能:

最好使用路径模块中的函数,而不是直接操作字符串,因为路径模块可以透明地处理不同的操作系统。最后,请记住,在 Windows 上执行文件操作时,Elixir 会自动将斜杠 (/) 转换为反斜杠 (\)。

至此,我们介绍了 Elixir 提供的用于处理输入输出和与文件系统交互的主要模块。在下一节中,我们将深入了解一下,并了解输入输出系统如何在 VM 中实现。

进程

您可能已经注意到 File.open/2 返回一个类似 {:ok, pid} 的元组:

发生这种情况是因为输入输出模块实际上与进程一起工作(请参阅上一章)。假设文件是​​一个进程,当您写入已关闭的文件时,实际上是在向已终止的进程发送一条消息:

让我们更详细地了解当您请求 IO.write(pid, binary) 时会发生什么。输入输出模块向 pid 标识的进程发送一条消息,其中包含所需的操作。一个小的临时进程可以帮助我们看到它:

在 IO.write/2 之后,我们可以看到打印出来的输入输出模块发送的请求(一个四元素元组)。不久之后,我们看到它失败了,因为输入输出模块期望某种结果,而我们没有提供。

通过使用进程对输入输出设备进行建模,Erlang VM 甚至允许我们跨节点读取和写入文件。太棒了!

iodata 和 chardata

在上面的所有示例中,我们在写入文件时都使用了二进制文件。但是,Elixir 中的大多数 IO 函数也接受“iodata”或“chardata”。

使用“iodata”和“chardata”的主要原因之一是性能。例如,假设您需要在应用程序中向某人打招呼:

由于 Elixir 中的字符串是不可变的,与大多数数据结构一样,上面的示例会将字符串“Mary”复制到新的“Hello Mary!”字符串中。虽然这对于上面的短字符串来说不太可能,但对于大字符串来说,复制可能非常昂贵!因此,Elixir 中的 IO 函数允许您传递字符串列表:

在上面的示例中,没有复制。相反,我们创建一个包含原始名称的列表。我们将此类列表称为“iodata”或“chardata”,我们很快就会了解它们之间的确切区别。

这些列表非常有用,因为它实际上可以在几种情况下简化字符串的处理。例如,假设您有一个值列表,例如 [“apple”、“banana”、“lemon”],您希望用逗号分隔这些值写入磁盘。您如何实现这一点?

一种方式是使用 Enum.join/2 并将值转换为字符串:

以上通过将每个值复制到新字符串中来返回一个新字符串。但是,有了本节中的知识,我们知道我们可以将字符串列表传递给 IO/File 函数。因此我们可以这样做:

"iodata" 和 "chardata" 不仅包含字符串,还可能包含任意嵌套的字符串列表:

"iodata" 和 "chardata" 也可能包含整数。例如,我们可以使用 ? 作为分隔符来打印以逗号分隔的值列表,该分隔符表示逗号 (44):

"iodata" 和 "chardata" 之间的区别正是所述整数所代表的内容。对于 iodata,整数表示字节。对于 chardata,整数表示 Unicode 码位。对于 ASCII 字符,字节表示与码位表示相同,因此它适合这两种分类。但是,默认 IO 设备与 chardata 一起工作,这意味着我们可以这样做:

总体而言,列表中的整数可能表示一堆字节或一堆字符,使用哪一个取决于 IO 设备的编码。如果文件未经过编码打开,则文件应处于原始模式,并且必须使用 IO 模块中以 bin* 开头的函数。这些函数需要 iodata 作为参数,其中列表中的整数表示字节。

另一方面,默认 IO 设备 (:stdio) 和使用 :utf8 编码打开的文件与 IO 模块中的其余函数一起工作。这些函数需要 chardata 作为参数,其中整数表示码位。

虽然这是一个微妙的差异,但如果您打算将包含整数的列表传递给这些函数,则只需担心这些细节。如果您传递二进制文件或二进制文件列表,则不会出现歧义。

最后,还有最后一个构造称为 charlist,我们在前面的章节中讨论过。Charlist 是 chardata 的一个特例,其中所有值都是表示 Unicode 码位的整数。它们可以用 ~c 符号创建:

字符列表主要出现在与 Erlang 交互时,因为一些 Erlang API 使用字符列表作为字符串的表示。因此,任何包含可打印 ASCII 码位的列表都将打印为字符列表:

我们在这个小部分中塞进了很多内容,让我们来整理一下:

1.iodata 和 chardata 是二进制和整数的列表。这些二进制和整数可以任意嵌套在列表中。它们的目标是在使用 IO 设备和文件时提供灵活性和性能;

2.iodata 和 chardata 之间的选择取决于 IO 设备的编码。如果文件在没有编码的情况下打开,则文件需要 iodata,并且必须使用以 bin* 开头的 IO 模块中的函数。默认 IO 设备 (:stdio) 和使用 :utf8 编码打开的文件需要 chardata,并与 IO 模块中的其余函数配合使用;

3.charlists 是 chardata 的一个特例,它专门使用整数 Unicode 代码点列表。它们可以使用 ~c 符号创建。如果列表中的所有整数都代表可打印的 ASCII 代码点,则使用 ~c 符号自动打印整数列表。

这结束了我们对 IO 设备和 IO 相关功能的介绍。我们了解了三个 Elixir 模块 - IO、File 和 Path - 以及 VM 如何使用进程来实现底层 IO 机制以及如何使用 chardata 和 iodata 进行 IO 操作。

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

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

相关文章

Linux 终端窗口设置为透明

Linux 终端窗口设置为透明 打开终端 右键鼠标 选择Profile Preferences 点击Background 选择 Transparent background 拖动滑条调整透明度 完成。

【机器学习】集成学习方法:Bagging与Boosting的应用与优势

🔥 个人主页:空白诗 文章目录 引言一、集成学习的定义二、Bagging方法1. 随机森林(Random Forest)2. 其他Bagging方法 二、Boosting方法1. 梯度提升树(Gradient Boosting Machine, GBM)解释GBM的基本原理和…

笔记本开机原理

从按下开机键开始,机器是如何开到OS的呢?今天这篇文章和大家极少EC-BIOS-OS的整个开机流程。首先大家要对笔记本的基本架构有所了解,基本架构如下图所示(主要组成部分为大写黑体内容)。 一、按下PowerButton按钮&#…

手把手带你搞定用户权限控制 | 纯干货

在实际的软件项目开发过程中,用户权限控制可以说是所有运营系统中必不可少的一个重点功能,根据业务的复杂度,设计的时候可深可浅,但无论怎么变化,设计的思路基本都是围绕着用户、角色、菜单这三个部分展开。 如何设计…

Matlab的Simulink系统仿真(simulink调用m函数)

这几天要用Simulink做一个小东西,所以在网上现学现卖,加油! 起初的入门是看这篇文章MATLAB 之 Simulink 操作基础和系统仿真模型的建立_matlab仿真模型搭建-CSDN博客 写的很不错 后面我想在simulink中调用m文件 在 Simulink 中调用 MATLA…

Git 基础操作(一)

Git 基础操作 配置Git 安装完Git后,首先要做的事情是设置你的 用户名 和 e-mail 地址。这样在你向仓库提交代码的时候,就知道是谁提交的,以及提交人的联系方式。 配置用户名和邮箱 使用git config [--global] user.name "你的名字&qu…

失眠焦虑?这些维生素或许能帮你找回好眠!

💤 失眠、焦虑,是现代生活中不少人都可能遇到的问题。长期的失眠与焦虑,不仅影响身体健康,更会对精神状态造成不小的冲击。其实,除了调整作息和放松心情,适当的维生素补充也可能有助于改善这些症状。 &…

SpringCloud-远程调用OpenFeign-基本使用

目录 1 直接使用RestTemplate发起Http请求 1.1 将RestTemplate注册为SpringBean 1.2 在service实现类中注入RestTemplate 1.3 使用注入的RestTemplate 传入参数后发起http请求 2 引入Nacos后使用RestTemplate发起Http请求 2.1 基础知识 2.2 Nacos的使用 2.2.1 引入nac…

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理: 夸克网盘:https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘:https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP:https://mp.weixin.…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

🍀简介 Options是.net Core Web api框架自带的功能,Options模式通过定义强类型的类来表示相关配置设置的集合,使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理(必做)1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目(FreeStyle Project)(推荐)三、Maven项目&#…

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库,使用绑定参数获取数据时,出现报错 如果使用PDO_OCI接口连接数据库,未弹出异常,但是无法正确获取数据 【问题原因分析】 开启O…

springcloud第4季 分布式事务seata作用服务搭建

一 seata作用 1.1 作用 二 seata服务端搭建 2.1 seata搭建 2.2.1 seata 服务端下载安装 下载地址: Seata-Server下载 | Apache Seata 截图如下: 2.2.2 使用mysql初始化seata所需表 1.下载脚本地址:incubator-seata/script/server/db/…

2024最新D卷 华为OD统一考试题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

Nas实现软路由OpenWrt安装

文章目录 基本配置步骤 基本配置 NAS:TS-264C 宇宙魔方 步骤 1.下载软路由OpenWrt 下载地址:https://openwrt.org/ 2.下载好以后,需要下载虚拟盘转换工具(StarWind V2V Convert) 下载地址:https://…

大模型与知识智能:心理疾病治疗的新希望

前言 随着社会的发展,心理疾病已成为一个日益突出的问题。据《柳叶刀》杂志的系统性综述显示,疫情之后,全世界抑郁症与焦虑症的患病率上升超过25%,其中青少年心理健康的影响最大。此外,2021年国内的精神障碍报告显示&…

Docker 镜像库国内加速的几种方法

在国内,拉取 Docker 镜像速度慢 / 时不时断线 / 无账号导致限流等,比较痛苦。 这里提供几个当前可用的镜像仓库,更新到/etc/docker/daemon.json即可。 更新完记得运行: sudo systemctl daemon-reload sudo systemctl restart …

以keepalived为例说明程序不能正常被gdb调试的原因

现象 通过gdb att $keepalived_pid发起对当前运行keepalived的调试; 在放行keepalived继续执行后,想通过CtrlC按键中断执行,观察下被调试程序的当前内部状态, 但是,在终端输入CtrlC后,导致keepalived被调…

一般简单的功能使用GIS 服务器工具还需要进行扩展开发吗?

有网友困惑怎么使用了我们的 GIS 服务器工具,一些简单的功能需不需要对服务器进行扩展开发?下面我们首先看一下标准GIS WEB服务器例如GEOSERVER,QGISSERVER、GIS数据快捷共享发布工具(建立自己的地图网站)及其它一些商…

Python虚拟环境的配置

前言: 本人一度被Python的虚拟环境的配置所困扰,前段时间抽空学习了一下,现在总结一下方法,供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …