将erlang值保存到文件并将其加载回的过程是什么?

将erlang值保存到文件并将其加载回的过程是什么?,erlang,Erlang,例如,我有一个列表,我想保存为一个包含许多其他erlang类型的文件。然后我想把它加载回一个进程,我会用什么io库:格式(“~P”,术语])与io:write,然后文件:查阅?是。请注意,每个术语都需要一个尾随点,并且file:consult返回文件中所有以点结尾的术语的列表。因此,如果您只有一个术语,代码如下所示: ok = file:write_file("myfile", io_lib:format("~p.~n", [Term])), {ok, [Term]} = file:consul

例如,我有一个列表,我想保存为一个包含许多其他erlang类型的文件。然后我想把它加载回一个进程,我会用什么<代码>io库:格式(“~P”,术语])与
io:write
,然后
文件:查阅

是。请注意,每个术语都需要一个尾随点,并且

file:consult
返回文件中所有以点结尾的术语的列表。因此,如果您只有一个术语,代码如下所示:

ok = file:write_file("myfile", io_lib:format("~p.~n", [Term])),
{ok, [Term]} = file:consult("myfile").

作为Legocia解决方案的替代方案,您还可以将
erlang:term_to_binary/1
的结果写入文件,并使用
erlang:binary_to_term/1
将其读回。不过,这种方法有几个警告:

  • 该文件将不具有可读性(至少不容易)
  • 您无法轻松存储多个术语,因为
    erlang:term_to_binary/1
    会生成空字符和换行符,这会造成解析问题。不过,有几种方法可以解决这个问题:
    • base64对术语进行编码,并用换行符分隔
    • 将您的术语存储在另一个术语中。例如,如果要存储三个术语,请使用
      erlang:term_to_binary({T1,T2,T3})
  • 没有方便的
    文件:请查阅
    术语到二进制
    的等效文件,因此必须显式读取(作为二进制),然后运行
    二进制到术语
  • 那么,你为什么要费心处理erlang:term_to_binary/1?原因有二:

  • 空间效率(在大多数情况下)
  • 解析速度(解析
    术语到二进制
    比人类可读的术语更快)

  • 此外,您可以使用
    erlang:term_to_binary/2
    并将[compressed]作为gzip压缩的第二个参数。不过,这并不是简单地包含在文件模块中,这有点令人恼火!