现在的位置: 首页 > 综合 > 正文

Clojure语言七:I/O

2013年06月21日 ⁄ 综合 ⁄ 共 1421字 ⁄ 字号 评论关闭

对应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

抱歉!评论已关闭.