15

假设我的 clojure 项目中有两个文件,一个是 clj,另一个是 txt。有没有办法从 clj 文件中知道 txt 文件的路径(作为字符串)?

有:

(System/getProperty "user.dir") 

或者

(-> (java.io.File. ".") .getAbsolutePath)

但这给出了当前目录所在的位置。包含clj文件的那个,写代码的那个。但是怎么知道txt文件的路径呢?目的是从clj文件写入这个txt文件。

谢谢你。

4

4 回答 4

8

在 Java 和 Clojure 中,您可以在 CLASSPATH 上找到文件。例如,在 Java 中,通常将 log4j.properties 之类的内容放在 CLASSPATH 的顶​​部(例如,在 classes 目录中),然后您可以在 Clojure(或 Java)代码中引用该文件:

(java.io.File. "log4j.properties")

您是否正在使用 Leiningen 并运行您的应用程序?如果是这样,您可以在顶层创建一个目录并将文件放在那里。例如,如果你有一个配置文件,你可以有一个带有属性文件的“conf”目录:

my-lein-proj$ ls
conf  doc  project.clj  README.md  src  target  test

假设您将 myproj.conf 文件放在 conf 目录中,并且您想在 Clojure 代码中读取该文件。然后你可以这样做:

(slurp "conf/myproj.conf")
于 2013-02-24T14:13:31.373 回答
3

Clojure 库本地文件允许您使用local-file/project-dir. 只要您知道要访问的文件在项目中的哪个位置,您应该可以通过这种方式找到它。

于 2013-02-24T20:51:16.730 回答
1

This gives where the current clj file, the one that this code is written in.

No, it doesn't. It gives the current directory.

Did you take into account that one can run clojure scripts that are not in the current directory?

于 2013-02-24T10:06:21.070 回答
0

如果您的文件结构与此类似:

配置 | 源 | 目标 | 测试

你在 config 目录中有一个配置,在我们的例子中假设它的 java.config 并且你试图在 src 目录中的 core.clj 中读取这个文件你也可以使用clojure.java.io/reader方法

例如:

(clojure.java.io/reader "config/java.config")

您可以在 repl 中运行以下命令以查看文件的内容

(slurp (clojure.java.io/reader "config/java.config")

如果您有兴趣逐行读取文件的内容,您可以将上述函数与 with-open 方法结合使用并逐行读取:

(with-open [word (clojure.java.io/reader "config/java.config")]
  (loop [c (.read word)]
    (if (not= c -1)
      (do
        (print (char c))
        (recur (.read word))))))
于 2021-04-30T12:54:20.480 回答