我是 Clojure 的新手,我需要 Clojure 为我做一个简单的任务,相当于下面的 Java 代码:
MappedByteBuffer out = new RandomAccessFile("file", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 100);
但是 Clojure 是一种动态语言,map() 返回 DirectByteBuffer 而不是 MappedByteBuffer。我希望使用 setInt() 方法,它是 MappedByteBuffer 的成员。有没有办法告诉 Clojure 使用 MappedByteBuffer 中的方法而不是 DirectByteBuffer?
谢谢!
顺便说一句,这是我的尝试:
(defprotocol MfileP
(at [this pos])
(get-i [this])
(set-i [this val])
(resize [this size])
(fsize [this]))
(defrecord Mfile [fc buf] MfileP
(at [this pos] (.position buf pos))
(get-i [this] (.getInt buf))
(set-i [this val] (.setInt buf val))
(resize [this size] (assoc this :buf (.map fc FileChannel$MapMode/READ_WRITE 0 size)))
(fsize [this] (.size fc)))
(defn open [path]
(let [fc (.getChannel (new RandomAccessFile path "rw"))]
(let [buf (.map fc FileChannel$MapMode/READ_WRITE 0 (.size fc))]
(Mfile. fc buf))))
表单 (set-i) 会引发异常,因为 Clojure 正在 DirectMapBuffer 中寻找 .setInt。