1

在 clojure-xml 文档的上下文中,我无法弄清楚 InputStream 是什么。clojure-xml 文档将clojure-xml/parse 的输入列为“文件、输入流或字符串命名 URL”。

我试过:

(defn open-file
    "Attempts to open a file and complains if the file is not present."

    [file-name]
        (let [file-data (try 
                            (slurp file-name)
                            (catch Exception e))]
            file-data))


(clojure-xml/parse (utl/open-file "test.xml"))

并收到此错误:

FileNotFoundException /home/cnorton/projects/clojure/xml-lib/< 
(No such file or directory)  java.io.FileInputStream.open 
(FileInputStream.java:-2)

但这有效:

(clojure-xml/parse "test.xml")

为什么不将 InputStream 视为打开文件的结果?因此,在这种情况下,什么是 InputStream?

4

1 回答 1

4

InputStream 指的是java.io.InputStream。在 Clojure 中获得一个的最简单方法是使用 clojure.java.io/input-stream

clojure.xml/parse 应该接受 clojure.java.io/input-stream 可以接受的任何内容。例子:

(require '[clojure.xml :as xml])
(require '[clojure.java.io :as io])

(xml/parse "/Users/bsmith/.m2/settings.xml")
(xml/parse (io/input-stream "/Users/bsmith/.m2/settings.xml"))

“/Users/bsmith/.m2/settings.xml”和“文件名”的区别:

“/Users/bsmith/.m2/settings.xml”是一个字符串,它(发生)指定我的文件系统上文件的(绝对)路径。然而,在 Java 世界中,类 java.io.File 是表示文件路径的惯用方式。clojure.java.io 不在乎,它会接受 String 命名文件或 java.io.File 命名文件。

您在最初的帖子中收到的错误消息是因为您首先使用 slurp 将 XML 加载到字符串中。(这不是一个好主意,因为 XML 带有它自己的编码,而 slurp 无法解释。)无论如何,您随后传递了字符串,clojure.java.io 最终尝试将XML的实际内容解释为一个文件路径,这显然是行不通的。

于 2012-06-26T18:50:20.463 回答