2011-08-09 89 views
3

我一直在嘗試開發一個用於讀取Clojure中的MPQ文件的小型庫,並且我決定使用RandomAccessFile,因爲MPQ是一種二進制格式。如何正確讀取Clojure中的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

你在一個單一的載體傳遞的參數,它正試圖轉換爲字節數組,因此它可以調用單個參數讀取方法,該方法在一個字節數組。只需傳遞參數即可。

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