3

私はClojureでMPQファイルを読み取るための小さなライブラリを開発しようとしてきましたが、MPQはバイナリ形式であるため、RandomAccessFileを使用することにしました。

ただし、メソッドRandomAccessFile#read()を正しく呼び出しているかどうかわからないため、メソッドに問題があります。

コードは次のとおりです。

(ns parser
  (:import (java.io RandomAccessFile)))


(with-open [file (RandomAccessFile. "replay.SC2Replay" "r")]
  (let [x (byte-array 16)]
    (.read file [x 0 16])))

コードを実行すると、

Exception in thread "main" java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to [B (parser.clj:0)
    at clojure.lang.Compiler.eval(Compiler.java:5440)
    at clojure.lang.Compiler.load(Compiler.java:5857)
    at clojure.lang.Compiler.loadFile(Compiler.java:5820)
    at clojure.main$load_script.invoke(main.clj:221)
    at clojure.main$script_opt.invoke(main.clj:273)
    at clojure.main$main.doInvoke(main.clj:354)
    at clojure.lang.RestFn.invoke(RestFn.java:409)
    at clojure.lang.Var.invoke(Var.java:365)
    at clojure.lang.AFn.applyToHelper(AFn.java:163)
    at clojure.lang.Var.applyTo(Var.java:482)
    at clojure.main.main(main.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to [B
    at parser$eval7.invoke(parser.clj:7)
    at clojure.lang.Compiler.eval(Compiler.java:5424)
    ... 15 more

例外。一時変数に対してもこれを試してみました

(let [x []]

ただし、どちらも同じ例外が発生します。Javaの同じコードは次のようになります

RandomAccessFile file = new RandomAccessFile("replay.SC2Replay", "r");
byte[] x;
file.read(x, 0, 16);
4

1 に答える 1

4

引数として単一のベクトルを渡しています。これはバイト配列にキャストしようとしているため、バイト配列を受け取る単一引数の読み取りメソッドを呼び出すことができます。引数をそのまま渡すだけです。

(with-open [file (RandomAccessFile. "replay.SC2Replay" "r")]
  (let [x (byte-array 16)]
    (.read file x 0 16)))
于 2011-08-09T20:13:21.507 に答える