我目前正在努力学习Clojure,作为我实践训练的一部分,我是
实现一些众所周知的Unix工具(如grep
)的基本行为,
cat
,ls
等等。
在实施cat
时,我偶然发现了一些看似奇怪的行为
slurp
。当lein run some-file.txt
some-file.txt
时使用(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))))
运行以下代码时
位于当前目录中,内容按预期打印到STDOUT。
uberjar
但是,如果我lein compile
lein uberjar
项目
cd
然后target/uberjar
到java -jar cat-0.1.0-SNAPSHOT-standalone.jar some-file.txt
运行独立的JAR
slurp
(该目录中存在文本文件),
除了我的调试信息之外什么也没打印我发现很奇怪的是没有错误
消息显示,所以在我看来,可以找到该文件。如果我跑了
JAR用一个不存在的文件作为参数,我得到一个指定的exeption
无法找到文件(正如预期的那样)。
因为我在Windows机器上工作,所以同事建议也许是Windows 影子文件可能有问题。所以我再次测试了Linux下的程序 发生了相同的行为。所以这似乎是一个问题"与我的Clojure理解/我的项目 设置。
我的问题是:为什么lein run
(或程序的)行为在运行时会有所不同
使用java -jar cat-0.1.0-SNAPSHOT-standalone.jar
以及使用(slurp (clojure.java.io/resource filename))
运行独立JAR时,我该怎么做才能解决此问题?
由于file参数不是编译到JAR中的资源,因此没有
如果我没有弄错的话需要public void walk(String path) {
try (Stream<Path> allFiles = Files.walk(Paths.get(path))) {
allFiles.filter(path -> path.toString().endsWith(".txt"))
.forEach(System.out::println);
}
}
。
答案 0 :(得分:3)
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)))