2014-05-23 25 views
3

例如我有一个列表我想保存为一个文件,它有很多其他的erlang类型。然后我想将它加载回过程中我会用什么? io_lib:format("~P", [Term])io:write然后file:consult将erlang值保存到文件并加载它们的过程是什么?

+1

顺便说一句,这是可能的(甚至是正常的吗?) [写一个反函数到'file:consult/1'](http://zxq9.com/archives/1021)。虽然这不是简单地包含在文件模块中,但有点令人烦恼! – zxq9

回答

3

作为替代legoscia的解决方案,你也可以写的erlang:term_to_binary/1结果到一个文件中,并与erlang:binary_to_term/1读回。有这种方法的几个注意事项,但:

  1. 的文件不会是人类可读的(至少不容易)
  2. 你不能轻松地存储多个方面,因为erlang:term_to_binary/1能产生空字符和换行符,这可能会造成解析问题。有几种方法可以解决这个问题:
    • base64对术语进行编码并以换行符分开
    • 将您的术语存储在另一术语中。举例来说,如果你有你想存储三个方面,使用erlang:term_to_binary({T1, T2, T3})
  3. 有一个为term_to_binary没有派上用场file:consult相等的,所以你必须明确地读(如二进制),然后运行binary_to_term

那么你为什么要打扰erlang:term_to_binary/1呢?有两个原因:

  1. 空间效率(在大多数情况下)
  2. 解析速度(快解析term_to_binary比人类可读的术语)
+1

此外,您可以使用'erlang:term_to_binary/2'并传递[compressed]作为gzip压缩的第二个参数。 –

2

是的。请注意,每个术语需要一个尾部点,并且file:consult返回文件中所有以点结尾的术语列表。所以,如果你只有一个学期,代码如下所示:

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