1

我目前正在尝试学习 Clojure,作为我实践培训的一部分,我正在实现一些众所周知的 Unix 工具(如grepcat等)的非常基本的行为ls

在实施cat时,我偶然发现了一些看似奇怪的 slurp. 当我在当前目录中运行以下代码lein run some-file.txtsome-file.txt ,内容会按预期打印到 STDOUT。

(ns cat.core
  (:gen-class))

(defn -main
  "Reads the content of its arguments representing filenames and outputs the
  content in succession."
  [& filenames]
  (doseq [filename filenames]
    (println "Reading" filename) ; Just for debugging purposes
    (print (slurp filename))))

但是,如果我uberjar的项目与

lein compile
lein uberjar

然后cd使用(该目录中存在文本文件)target/uberjar运行独立 JAR ,只打印我的调试消息。java -jar cat-0.1.0-SNAPSHOT-standalone.jar some-file.txt我觉得很奇怪的是没有显示错误消息,所以在我看来可以找到该文件。如果我使用不存在的文件作为参数运行 JAR,我会得到一个无法找到指定文件的异常(如预期的那样)。

因为我在 Windows 机器上工作,一位同事建议也许 Windows 影子文件可能是一个问题。所以我再次在Linux下测试了程序,同样的行为发生了。所以这似乎是我对 Clojure 的理解/我的项目设置的“问题”。

我的问题是:为什么在运行和运行独立 JAR 时slurp的(或程序的)行为不同,我能做些什么来解决这个问题?lein runjava -jar cat-0.1.0-SNAPSHOT-standalone.jar

由于文件参数不是编译到JAR中的资源,所以(slurp (clojure.java.io/resource filename))如果我没记错的话,没有必要。

4

1 回答 1

4

print不刷新输出缓冲区。您需要在声明flush之后print使用,或者使用另一个println在换行符上刷新的 :

(defn -main
  "Reads the content of its arguments representing filenames and outputs the
  content in succession."
  [& filenames]
  (doseq [filename filenames]
    (print (slurp filename))
    (flush)))
于 2016-04-02T14:47:55.177 回答