有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Clojure中写入文件

我使用这个函数在Clojure中写入一个文件


(defn writelines [file-path lines]
  (with-open [wtr (clojure.java.io/writer file-path)]
    (doseq [line lines] (.write wtr line))))

但这总是会产生这样的错误:

IllegalArgumentException No matching method found: write for 
class java.io.BufferedWriter in
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)

我做错了什么


共 (3) 个答案

  1. # 1 楼答案

    试试这个:

    (defn writelines [file-path lines]
      (with-open [wtr (clojure.java.io/writer file-path)]
        (binding [*out* wtr]
          (doseq [line lines] (print wtr line)))))
    

    如果你看一下BufferedWriter的文档,你会发现没有与你调用write的方式对应的方法(哎呀,我错过了继承的方法,傻我!)。我认为,绑定到*out*更容易(除非您还想输出调试信息,在这种情况下可能会有点棘手)

  2. # 2 楼答案

    根据异常消息,行不是字符串、int(字符)或int数组的序列

  3. # 3 楼答案

    首先,对于许多输入,您的函数都可以正常工作:

    Clojure 1.3.0
    user=> (defn writelines [file-path lines]
      (with-open [wtr (clojure.java.io/writer file-path)]
        (doseq [line lines] (.write wtr line))))
    #'user/writelines
    user=> (writelines "foobar" ["a" "b"])
    nil
    user=> (writelines "quux" [1 2])
    nil
    

    然而,当你试图传递一些奇怪的信息时,我们会得到你描述的错误:

    user=> (writelines "quux" [#{1}])
    IllegalArgumentException No matching method found: write for class  java.io.BufferedWriter  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
    

    这个错误是因为BufferedWriter有多个重载版本的write,而clojure不知道调用哪个版本。在这种情况下,冲突的是write(char[])write(String)。对于字符串("a")和整数(1)等输入,clojure知道调用方法的String版本,但对于其他内容(例如clojure集合,#{1}),clojure无法决定

    或者确保writelines的输入确实是String的输入,或者使用str函数对它们进行字符串化,怎么样

    另外,看看^{} function