非常教程

Elixir 1.5参考手册

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/0Erlang 当前的快捷方式
  • :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)

写一个messagestderr,以及当前的堆栈跟踪

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的情况下将返回一个空字符串。
  • 注意:不要在Unicode模式下在IO设备上使用此函数,因为它将返回错误的result.binstream (device,line_or_bytes)binstream(device,:line | pos_integer):: Enumerable.t将IO device转换为IO.Stream。该操作是Unicode不安全的。
  • 一个 IO.Stream实现了两者,EnumerableCollectable允许它用于读和写。device迭代了给定数量的字节或逐行if:line给出。这将从IO设备读取为原始二进制文件。请注意,IO流具有副作用,并且每次检查流时都会得到不同的结果。最后,不要在Unicode模式下在IO设备上使用此函数,因为它将返回错误的结果.binwrite(device \:stdio,item)
  • binwrite(device,iodata):::ok | {:error,term} item以给定的二进制形式写入device。没有Unicode转换发生。注意write/2:不要在Unicode模式下在IO设备上使用此函数,因为它会返回错误的result.charata_to_string(string)chardata_to_string(chardata):: String.t | no_returnConverts chardata(表示代码点,列表和字符串的整数列表)转换为字符串。如果转换失败,它会引发UnicodeConversionError。如果给出了字符串,则返回字符串本身。示例IO> “string”)“string”getn(prompt,count \ 1)getn(device,chardata | String.Chars.t):: chardata | nodatagetn(chardata | String.Chars.t,pos_integer):: chardata | nodata从IO设备获取大量字节:stdio。如果:stdio是Unicode设备,则count表示要检索的Unicode码点数。否则,count是要检索的原始字节数。请参阅返回IO.getn/3值的描述。getn(device,prompt,count)getn(device,chardata | String.Chars.t,pos_integer):: chardata | nodata从IO获取大量字节devicedevicecount意味着要检索的Unicode码点的数量。否则,count是要检索的原始字节数。它返回:
  • 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 >>
  • 我们可以使用:label选项以装饰输出:IO.inspect 1..100,label:“一个精彩的范围”打印:一个精彩的范围:1..100该:label选项对管道尤其有用:[1,2,3]
  • |> IO.inspect(标签:“before”)
  • |> Enum.map(&(&1 * 2))
  • |> IO.inspect(label:“after”)
  • |> Enum.sumPrints:before:[1,2,3] after:[2 ,4,6]检查(装置,项目,选择采用)检查(装置,物品,关键字)::项目时项目:varInspects item根据使用IO给定的选项device。见inspect/2获取完整的options.iodata_length(item)列表iodata_length(iodata):: non_neg_integer返回由编译器内置的iodata的大小.Examplesiex> IO.iodata_length([1,2 | << 3,4 >>])4iodata_to_binary (item)iodata_to_binary(iodata):: binaryConverts iodata(表示字节,列表和二进制文件的整数列表)转换为二进制文件。该操作是Unicode不安全的。注意这个函数将整数列表当作原始字节处理,并且不执行任何类型的编码转换。如果您想从charlist转换为字符串(UTF-8编码),请使用chardata_to_string/1如果此函数接收到二进制文件,则由编译器返回相同的二进制文件.
  • Examplesiex> bin1 = << 1,2,3 >>
  • iex> bin2 = << 4,5 >>
  • iex> bin3 = << 6 >>
  • iex> IO.iodata_to_binary([bin1,1,[2,3,bin2],4 | bin3])<< 1,2,3,1,2,3,4,5,4,6 >> iex> bin = << 1,2,3 >> iex> IO.iodata_to_binary(bin)<< 1,2,3 >> puts(device \:stdio,item)puts(device,chardata | String.Chars.t ):: okWrites item给定device,类似于write/2,但在end.read(device \:stdio,line_or_chars)read(device,:all |:line | non_neg_integer):: chardata | nodata从IO中读取devicedevice如果:line给出,则由给定数量的字符或逐行重复读取。或者,:alldevice
  • 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实现两个EnumerableCollectable并允许它用于读和写。

如果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
IO
IO 详细
IO.ANSI 详细
IO.Stream 详细