2014-05-23 47 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"). 
相關問題