對應stdin, stdout和stderr, Clojure預設提供了*in*, *out*和*err* 三個symbols與之對應。
可以使用binding宏進行重新導向。比如下面的例子將*out* 重新導向到檔案中:
user=> (binding [*out* (java.io.FileWriter. "/home/chenshu/tt")] (println "Write to tt.") (flush))nil
本來輸出到控制台的語句現在寫到檔案tt中了,注意(flush)用來將緩衝區中的資料寫入到*out*中。
這個重新導向僅在binding運算式中有效,離開這個運算式後,*out*仍然是stdout.
可以直接讀取檔案,通過slurp函數(嘖嘖的吃):
user=> (slurp "/home/chenshu/a.xml")"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<service>\n <mongodb>\n <uri>localhost</uri>\n </mongodb>\n <socket>\n <port_number>7777</port_number> \n <login_timeout>200</login_timeout>\n <check_timeout>200</check_timeout>\n </socket>\n</service>\n"
通常寫程式,讀取設定檔後,內容儲存到var中,以便日後使用:
user=> (def s (slurp "/home/chenshu/a.xml"))#'user/suser=> s"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<service>\n <mongodb>\n <uri>localhost</uri>\n </mongodb>\n <socket>\n <port_number>7777</port_number> \n <login_timeout>200</login_timeout>\n <check_timeout>200</check_timeout>\n </socket>\n</service>\n"
不需要上面的重新導向,使用下面函數spit(吐口水)可以寫檔案:
user=> (spit "b.xml" s)niluser=> (slurp "b.xml")"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<service>\n <mongodb>\n <uri>localhost</uri>\n </mongodb>\n <socket>\n <port_number>7777</port_number> \n <login_timeout>200</login_timeout>\n <check_timeout>200</check_timeout>\n </socket>\n</service>\n"user=>
Clojure語言也在演化,還是要關注官方文檔。
I/O的文檔主要在:http://clojure.org/cheatsheet IO一節。
還有:http://clojure.github.com/clojure/clojure.java.io-api.html
另外這裡也可以參考:http://java.ociweb.com/mark/clojure/article.html#IO