我是Clojure的新手,我需要Clojure为我做一个简单的任务,它等效于以下Java代码:

MappedByteBuffer out =新的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。

最佳答案

您没有说自己如何确定map()正在返回DirectByteBuffer。不是-毫无疑问,它正在返回抽象类MappedByteBuffer的子类。

根据JDK文档,没有方法MappedByteBuffer#setInt(int)

您应该对接口进行编码。

看到:

java.nio.FileChannel#map(...) javadocs

java.nio.MappedByteBuffer javadocs

09-25 22:15