首页 > 代码库 > clojure.java.io包能够解决哪些io问题?

clojure.java.io包能够解决哪些io问题?

网上不少关于clojure的io的例子都喜欢用java代码来表达,难道是clojure本身提供的io不够灵活吗?很有可能是举例的作者没有仔细阅读clojure.java.io的文档。clojure.java.io应该涵盖了95%以上的使用场景,让我们一起来理一理。

可能的场景:

1、你已经有了一个String,想写入到文件中。

(io/copy you-string (io/file "/tmp/xx.xx") :encode "utf-8")

2、你有了一个url,想把内容写入文件中

(io/copy (io/input-stream "http://www.baidu.com") (io/file "c:/tmp.txt"))

如果你注意一下包中的IOFactory,它支持以下对象:

array-of-bytes, array-of-characters, java.io.BufferedInputStream, java.io.BufferedOutputStream, java.io.BufferedReader, java.io.BufferedWriter, java.io.File, java.io.InputStream, java.io.OutputStream, java.io.Reader, java.io.Writer, java.lang.String, java.net.Socket, java.net.URI, java.net.URL, Object

IOFactory通过multimethod,根据不同的参数类型,猜测出最合适的处理方式。一般情况下,你只要按你的理解书写即可,除非结果和你想象的不符,这时才需要仔细分析一下。

比如对于io/reader,

Default implementations are provided for Reader, BufferedReader,

InputStream, File, URI, URL, Socket, byte arrays, character arrays,

and String.

也就是说你可以通过以下方式获取reader。

(io/reader (as-file "c:/xx.xx"))
(io/reader (as-url "http://somulr"))(io/reader "astring")
(io/reader (.getBytes "astring"))
(io/reader [\a \b \c])

总体来说,clojure.java.io已经充分考虑了各种场景,你完全可以用clojure方式来完成io。

clojure.java.io包能够解决哪些io问题?