对应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/s user=> 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) nil user=> (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