1

私は Clojure を初めて使用し、次の Java コードに相当する単純なタスクを実行するために Clojure が必要です。

MappedByteBuffer out = new RandomAccessFile("file", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 100);

ただし、Clojure は動的言語であるため、map() は MappedByteBuffer ではなく DirectByteBuffer を返します。MappedByteBuffer のメンバーである setInt() メソッドを使用したいと考えています。Clojure に DirectByteBuffer の代わりに MappedByteBuffer のメソッドを使用するように指示する方法はありますか?

ありがとう!

ところで、これは私の試みです:

(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))))

Clojure は DirectMapBuffer で .setInt を探しているため、フォーム (set-i) は例外をスローします。

4

2 に答える 2

4

map()あなたは、それが戻ってきたことをどのように確立したと思うかについては言いませんDirectByteBufferMappedByteBufferそうではありません -間違いなく抽象クラスのサブクラスを返しています。

MappedByteBuffer#setInt(int)JDK ドキュメントによる方法はありません。

インターフェイスにコーディングする必要があります。

見る:

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

java.nio.MappedByteBuffer javadocs

于 2012-04-29T12:01:42.727 に答える