将数据以文本格式传输到文件并保证关闭的Elixir习惯用法是什么?

时间:2016-09-17 08:44:06

标签: elixir

我编写了一些代码来生成值流,我想将这些代码发送到文本文件进行分析。我知道如何使用

打开文件
   { f, :ok } = File.open( 'foobar', [ :write, :utf8 ] )

但我找不到将流发送到此文件的方法,即使我确定这必须是微不足道的。

由于这可能是相当大量的数据,我想避免使用中间数据结构并坚持使用流式方法。如果可能的话,我也想保证文件将被关闭,即使出现错误也是如此。

1 个答案:

答案 0 :(得分:3)

使用File.stream!创建流。您不需要明确关闭流,因为每次start / stop / halt将数据流入其中时,Elixir会自动打开和关闭其文件。

  

请注意,每次开始播放时都会自动打开该文件。

Source

您可以使用Enum.into(或Stream.into)将可枚举或流写入File.stream!返回的文件流,而不将可枚举/流的值存储在内存中:

iex(1)> ["foo", "bar"] |> Enum.into(File.stream!("a.txt"))
%File.Stream{line_or_bytes: :line, modes: [:raw, :read_ahead, :binary],
 path: "a.txt", raw: true}
iex(2)> File.read!("a.txt")
"foobar"