2011-08-09 2 views
3

나는 Clojure에서 MPQ 파일을 읽기위한 작은 라이브러리를 개발하려고 노력해 왔으며 MPQ는 바이너리 형식이므로 RandomAccessFile을 사용하기로 결정했다. 나는이 코드를 실행하면Clojure에서 RandomAccessFile을 올바르게 읽는 방법은 무엇입니까?

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


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

: 내가 제대로 여기

를 호출하고있어 만약 내가 정말 모르겠어요으로

그러나, 나는, 방법 RandomAccessFile#read()와 코드를 문제가있어 데 , 나는 얻을

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 []] 

에 대해이 작업을 시도했지만 두 경우 모두 동일한 예외가 발생합니다. 자바에서 동일한 코드 당신은 취하는 단일 인수 읽기 메소드를 호출 할 수 있도록 바이트 배열로 캐스팅하려고 인수로 하나의 벡터에 전달하는이

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))) 
관련 문제