IO
IO
处理输入/输出(IO)的函数。
该模块中的许多功能都将IO设备作为参数。IO设备必须是表示进程的PID或原子。为方便起见,Elixir提供:stdio
并:stderr
作为快捷方式Erlang的:standard_io
和:standard_error
。
大部分函数都需要chardata,即字符串或字符和字符串列表。如果有其他类型,函数将通过String.Chars
协议转换为字符串(如typespecs中所示)。
以bin开头的函数希望将iodata作为参数,即二进制文件或字节和二进制文件的列表。
IO器件
IO设备可以是原子,也可以是PID。如果是原子,则原子必须是已注册进程的名称。此外,Elixir还提供了两个快捷方式:
:stdio
- 用于:standard_io
映射到Process.group_leader/0
Erlang 当前的快捷方式
:stderr
- Erlang提供的命名:standard_error
进程的快捷方式
IO设备保持其位置,这意味着后续对任何读写功能的调用将从设备上次访问的位置开始。文件的位置可以使用:file.position/2
功能。
摘要
类型
chardata()device()nodata()
功能
binread(device \ :stdio, line_or_chars)
从IO读取device
。该操作是Unicode不安全的
binstream(device, line_or_bytes)
将IO device
转换为IO.Stream
。该操作是Unicode不安全的
binwrite(device \ :stdio, item)
写item
为给定的二进制文件device
。没有Unicode转换发生。该操作是Unicode不安全的
chardata_to_string(string)
将chardata(表示代码点,列表和字符串的整数列表)转换为字符串
getn(prompt, count \ 1)
从IO设备获取若干字节。:stdio
getn(device, prompt, count)
从IO中获取若干字节。device
gets(device \ :stdio, prompt)
从IO读取一行device
inspect(item, opts \ [])
检查并写入给定的item
到设备上
inspect(device, item, opts)
检查item
根据使用IO给定的选项device
iodata_length(item)
返回iodata的大小。
iodata_to_binary(item)
将iodata(表示字节,列表和二进制文件的整数列表)转换为二进制文件。该操作是Unicode不安全的
puts(device \ :stdio, item)
写入item
给定的device
,类似于write/2
,但在最后添加一个换行符
read(device \ :stdio, line_or_chars)
从IO读取device
stream(device, line_or_codepoints)
将IO device
转换为IO.Stream
warn(message)
写一个message
stderr,以及当前的堆栈跟踪
warn(message, stacktrace)
写一个message
给stderr,以及给定的stacktrace
write(device \ :stdio, item)
写item
给特定的device
类型
chardata()
chardata() :: :unicode.chardata
device()
device() :: atom | pid
nodata()
nodata() :: {:error, term} | :eof
功能
binread(device \ :stdio, line_or_chars)
binread(device, :all | :line | non_neg_integer) ::
iodata |
nodata
从IO读取device
。该操作是Unicode不安全的。
如果device
给出,则按给定的字节数或行逐行进行迭代:line
。或者,如果:all
给出,则整个device
返回。
它返回:
data
-输出字节
:eof
- 遇到文件结尾
{:error, reason}
- 其他(罕见)错误情况; 例如,{:error, :estale}
如果从NFS卷volumeIf中读取数据:all
,:eof,
则永远不会返回该数据,但在设备已达到EOF的情况下将返回一个空字符串。
data
-输入字符
:eof
-遇到档案末尾
{:error, reason}
- - 其他(罕见)错误条件; 例如,如果从NFS卷读取,则为{:error,:estale}
gets(device \ :stdio, prompt)
gets(device, chardata | String.Chars.t) :: chardata | nodata
从IO读取一行device
...
它返回:
data
- 行中的字符以换行符(LF)或文件结尾(EOF)结尾
:eof
-遇到档案末尾
- {:error, reason} - 其他(罕见)错误情况; 例如,{:error, :estale}如果从NFS卷读取示例要显示“你叫什么名字?”作为提示并等待用户输入:IO.gets“你叫什么名字?\ n”inspect(item,opts \ [])inspect(item,关键字):: item当项目:varInspects并写入给定item的设备。重要的是要注意,它返回给定的item不变。这样可以通过IO.inspect/2在代码中几乎任何位置插入一个调用来“窥探”值,例如,在管道中间。它默认启用较好的打印,宽度为80个字符。可以通过显式传递:width选项来更改宽度。输出可以用标签进行修饰,通过提供:label可以轻松区分它的选项IO.inspect/2调用。标签将被检查前被打印item。见Inspect.Opts剩余格式化options.ExamplesIO.inspect << 0,1,2 >>,宽度的完整列表:40Prints:<< 0,1,2 >>
data
-输出字符
:eof
-遇到档案末尾
{:error, reason}
- 其他(罕见)错误情况; 例如,{:error, :estale}
如果从NFS卷读取
如果:all
给出,:eof
则永不返回,但在设备已达到EOF的情况下为空字符串。
stream(device, line_or_codepoints)
stream(device, :line | pos_integer) :: Enumerable.t
将IO device
转换为IO.Stream
。
一个IO.Stream
实现两个Enumerable
与Collectable
并允许它用于读和写。
如果device
给出,则按给定数量的字符或逐行进行迭代:line
。
这从IO读取为UTF-8。检出IO.binstream/2
将IO作为原始二进制文件处理。
请注意,IO流有副作用,每次您遍历该流时,可能会得到不同的结果。
实例
下面是一个示例,说明我们如何从命令行模拟回送服务器:
Enum.each IO.stream(:stdio, :line), &IO.write(&1)
warn(message)
warn(chardata | String.Chars.t) :: :ok
写一个message
到stderr,以及当前的堆栈跟踪。
如果成功则返回:ok
。
实例
IO.warn "variable bar is unused"
#=> warning: variable bar is unused
#=> (iex) evaluator.ex:108: IEx.Evaluator.eval/4
warn(message, stacktrace)
warn(chardata | String.Chars.t, Exception.stacktrace) :: :ok
写一个message
给stderr,以及给定的stacktrace
。
这个函数还会通知编译器一个警告信息被打印出来(如果启用了错误警告)。如果成功则返回:ok
。
可以传递一个空列表来避免堆栈跟踪打印。
实例
stacktrace = [{MyApp, :main, 1, [file: 'my_app.ex', line: 4]}]
IO.warn "variable bar is unused", stacktrace
#=> warning: variable bar is unused
#=> my_app.ex:4: MyApp.main/1
write(device \ :stdio, item)
write(device, chardata | String.Chars.t) :: :ok
写item
给特定的device
。
默认情况下,device
是标准输出。如果成功则返回:ok
。
实例
IO.write "sample"
#=> sample
IO.write :stderr, "error"
#=> error