`
xiuzhuchenqing
  • 浏览: 16186 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Clojure中的IO

 
阅读更多

由于调用Java易如反掌,Clojure仅仅提供了一个用于处理I/O操作的非常小的函数集合,但是clojure.java.io库中的这些函数使得调用Java中那些处理I/O的类变得更加方便。

Clojure中预定义了几个特殊形式的全局绑定变量*in**out* 和 *err*,分别对应于标准输入、输出和错误处理 。(flush)】等价于【(.flush *out*),将输出缓冲中的内容刷到标注输出流*out*中。当然这些绑定变量都是可以改变的,比如向如下所示你可以把输出重定向到 "my.log"文件里面去: 

(binding [*out* (java.io.FileWriter. "my.log")]
...
(println "This goes to the file my.log.")
...
(flush))

   print函数能够将代表任意数量对象的字符串打印到特殊形式*out*所代表流中,这些对象用空格隔开 (print obj1 obj2),打印结果也将用单个空格隔开,要忽略这些空格可以写成这种形式(print str(obj1 obj2))。

println函数在输出换行符号时默认将缓冲刷入*out*中,但可以将*flush-on-newline*全局变量为false改变这一行为。

newline函数打印一个换行符号到*out*流中,println等价于print+newline。prprn函数分别对应printprintln,不同的是它们能够以一种Clojure读取器可读的形式进行输出,比较适合用于进行Clojure数据结构的序列化默认情况下,prprn不会打印元数据,可以通过将*print-meta*设置为true改变这一默认行为。

以下示例将阐述上述提到的所有四种打印函数:

(let [obj1 "foo"
      obj2 {:letter \a :number (Math/PI)}] ; a map
  (println "Output from print:")
  (print obj1 obj2)

  (println "Output from println:")
  (println obj1 obj2)

  (println "Output from pr:")
  (pr obj1 obj2)

  (println "Output from prn:")
  (prn obj1 obj2))

 上述代码的输出如下:

Output from print:
foo {:letter a, :number 3.141592653589793}Output from println:
foo {:letter a, :number 3.141592653589793}
Output from pr:
"foo" {:letter \a, :number 3.141592653589793}Output from prn:
"foo" {:letter \a, :number 3.141592653589793}

rint-strprintln-strpr-str and prn-str函数分别和printprintlnpr and prn一一对应,不同的将内容打印到一个返回的字符串中。

printfformat都是使用格式化的字符串作为参数,后者将结果打印到返回的字符串而非标准输出*out*中。

    with-open宏很适合用来处理一些像文件和数据库连接的资源。它可以持有任何数量的对象绑定,当其函数体中的表达式都被调用之后这些对象的.close会被调用

    line-seq函数接受一个java.io.BufferedReader对象并返回一个拥有这个对象中文本的行的懒惰序列。返回一个懒惰序列非常重要的意义是当其调用时不会真正读取所有的行,这会消耗不少内存。每向懒惰序列执行一次请求操作它都会读取一行数据。

 

下述代码结合使用with-open和line-seq,将从文件中读取所有行,并打印含有指定word的行:

(use '[clojure.java.io :only (reader)])

(defn print-if-contains [line word]
  (when (.contains line word) (println line)))

(let [file "story.txt"
      word "fur"]
  ; will print fur	
  ; with-open will close the reader after
  ; evaluating all the expressions in its body.
  (with-open [rdr (reader file)]
    (doseq [line (line-seq rdr)] (print-if-contains line word))))

 输出将如下所示:

 

#'user/print-if-contains
      word "fur"]
  ; will print fur	
nil

  函数slurp读取整合文件的内容到一个字符串中并返回该字符串,而函数spit则写入一个字符串到给定的文件中,完事之后便关闭。

    该文隔靴挠痒,仅仅谈到 Clojure内核和java.io库所提供的一些表层的东西,并没有深入,非常值得投入精力去通读clojure/java/io.clj,了解它所定义一些其它函数。

 

 

分享到:
评论

相关推荐

    clojure-pure-io:Clojure 的纯函数式 IO 实验

    在 Clojure 中实现 IO monad 的实验。 为什么 Haskell 应该拥有所有的乐趣(功能纯度)? 要深入解释这样做的动机和过程,请查看 为什么使用这个? 您可能不想将其用于任何赚钱目的,但写起来很有趣,并且希望对...

    在eclipse上面搭建Clojure开发运行环境

    接下来,为了在Eclipse中进行Clojure开发,我们需要安装一个名为Counterclockwise的插件。Counterclockwise是Eclipse上的Clojure IDE,它提供了代码编辑、调试、自动完成和测试支持等功能。可以通过以下步骤安装: ...

    clojure_api_cn:Clojure API 文档的中文翻译版

    翻译进度模块进度译者clojure.core进行中 , ,clojure.data无 clojure.inspector无 clojure.java.browse已完成clojure.java.io已完成clojure.java.javadoc已完成clojure.java.shell已完成clojure.main无 clojure....

    java.io:clojure.java.io 的 JK7 java.nio.file.Path 兼容性

    依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 下面的示例用法( require 'me.moocar.java.io)( require '[clojure.java.io :as jio])( import ...

    nginx-clojure.github.io:开源项目nginx-clojure的网站

    Nginx-Clojure的网站源码存储在`nginx-clojure.github.io`仓库中,通过`.github.io`的域名展示。用户可以浏览源代码,了解项目详情,甚至参与贡献。 【项目源码分析】 `nginx-clojure.github.io-master`是这个项目...

    restful-clojure:一个用 Clojure 编写的 RESTful 购物清单应用程序后端示例,伴随着 kendru.github.io 上的教程系列

    这个项目旨在为开发者提供一个学习Clojure和构建RESTful服务的实例,同时也配合了在kendru.github.io上发布的教程系列,使学习过程更具实践性。 Clojure是一种现代的、静态类型的函数式编程语言,它运行在Java...

    little crawler for clojure

    Clojure可以方便地与Java的IO和数据库API集成。 【标签】"clojure crawler" 指出项目的核心技术栈是Clojure和爬虫开发。这意味着项目开发者可能关注于如何利用Clojure的独特语法和功能来优化爬虫的性能和可读性。 ...

    另一种Craft.io:使用试剂在Clojure中进行多人Starcraft游戏克隆

    《另一种Craft.io:使用试剂在Clojure中进行多人Starcraft游戏克隆》 在这个项目中,开发者使用了Clojure编程语言以及Reagent库来构建一个多人在线的Starcraft游戏克隆版,名为“另一种Craft.io”。这个项目展示了...

    HTTPKit-Clojure的高性能事件驱动HTTP客户端服务器

    它以其轻量级、快速且易于使用的特性,在Clojure社区中受到了广泛欢迎。这个库是基于Java NIO(非阻塞I/O)构建的,充分利用了Java平台的优势,提供了高效的服务端和客户端解决方案。 在Clojure中,HTTPKit提供了...

    fs, 面向Clojure的文件系统实用程序.zip

    fs, 面向Clojure的文件系统实用程序 - 用于Clojure的文件系统实用程序 API文档这个库定义了一些用于在Clojure中处理文件系统的工具。 通常,它希望填补 clojure.java.io 留下的空白并添加( 美化) 所提供的java.io....

    understanding-monads:用 clojure 中的例子解释 monad

    在Clojure中,由于其多范式的特性,通常直接进行IO操作,如读写文件,但这并不意味着不能构建一个模拟IO Monad的系统。 通过实际编写代码并使用Clojure中的函数和数据结构,我们可以更好地理解Monad的运作方式。这...

    bankster:Clojure中的货币和货币处理

    银行家Clojure中的货币和货币处理 Clojure库可在具有加密货币和其他非标准令牌支持的货币单位上运行。特征纯Clojure实现。 多态界面(注册的货币可以表示为货币记录,数字,字符串或关键字)。 支持的操作:计算,...

    nginx-clojure:Nginx-Clojure 是一个 Nginx 模块,用于嵌入 Clojure 或 Java 程序-开源

    Nginx-Clojure 是一个 Nginx 模块,用于嵌入 Clojure 或 Java 或 Groovy 程序,通常是那些基于 Ring 的处理程序。 查看 http://nginx-clojure.github.io 了解更多详情

    clygments:在Clojure中使用Pygments突出显示代码

    output-file (str (clojure.java.io/file "/path/to/output/directory") (name file) ".html")] (spit output-file highlighted))) ``` 以上就是在Clojure项目中使用Clygments进行语法高亮的基本步骤。通过这种...

    fs:Clojure的文件系统实用程序(java.io.File的帮助程序)

    该库定义了一些用于在Clojure中处理文件系统的实用程序。 通常,它想填补clojure.java.io留下的空白,并添加(整理) java.io.File提供的内容。 注意:此库处于维护模式。 如果您使用的是JDK8或更高,请考虑使用...

    clojure:Clojure的实用介绍(由Gitbook.IO创建)

    在本研讨会中,我们采用了一种实践方法,每个人都可以使用Clojure代码,并使用REPL(交互式运行时环境)对其进行实验。 通过在REPL中评估,破坏,修复和扩展代码,您将很快对Clojure有所了解,同时始终获得有关您...

    掌握:使用clojure.spec regexes的Grep Clojure代码

    在Clojure中实现类似Grep的代码搜索功能,我们可以使用 `clojure.string/join` 和 `clojure.java.io/reader` 读取文件内容,然后结合 `clojure.core/filter` 和上面定义的正则表达式规格筛选出匹配的行。以下是一个...

    aleph:Clojure的异步通信

    Aleph将来自网络的数据显示为流,可以将其轻松转换为java.io.InputStream , 通道,Clojure序列或。 它公开了HTTP,TCP和UDP的简单默认包装器,但允许访问底层库的全部性能和灵活性。 [aleph " 0.4.6 " ] HTTP ...

    cljs-node-io:用于NodeJS的ClojureScript IO库

    [cljs-node-io "1.1.2"]cljs-node-io {:mvn/version "1.1.2"} 这是clojure.java.io到clojurescript的端口,对nodejs来说是有意义的。 目的是使Clojure程序员感到宾至如归,因此大多数事物都具有与jvm相同的签名和...

    kube-api:用于Clojure的kubernetes API客户端

    一组Clojure库,用于与Clojure应用程序中的Kubernetes进行交互。 由核心的Kubernetes客户端+提供更高级别构造的各种模块(有时具有附加的依赖性)组成。 为什么 一些Clojure Kubernetes库已经存在,但是并不全面。 ...

Global site tag (gtag.js) - Google Analytics