我是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