gpt4 book ai didi

java - Clojure - 如何将 DirectByteBuffer(由 getChannel.map 返回)转换为 MappedByteBuffer?

转载 作者:行者123 更新时间:2023-11-29 03:47:14 25 4
gpt4 key购买 nike

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

最佳答案

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

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

您应该为界面编写代码。

参见:

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

java.nio.MappedByteBuffer javadocs

关于java - Clojure - 如何将 DirectByteBuffer(由 getChannel.map 返回)转换为 MappedByteBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com