2010-06-02 2 views
11

Java에서 직렬화 된 float 값을 포함하는 파일에 대해 지연 시퀀스를 얻으려면 Clojure에서 이상적인 방법이 될 수 있을까요? (나는 라인 읽기 예제를 기반으로 with-open 접근법을 가지고 놀았지만 점들을 연결하여 수류를 스트림으로 처리 할 수 ​​없었다.)자바 float 파일을 게으른 Clojure 시퀀스로 처리하기

고마워.

+0

한 줄에 한 개씩 또는 탭으로 구분하거나 공백으로 구분하여 사용할 수 있습니까? 몇 가지 예제 데이터를 줄 수 있습니까? –

+0

설명 : 파일은 Java float (즉, 단순 유형 "float")의 이진 직렬화로 구성되며, 아무것도 구분하지 않습니다. 나는 (잠재적으로 매우 큰) 파일의 각 엔트리를 기반으로 한 계산을 원한다. 나는 그들 모두를 합치기를 원한다고 상상해 보라. 나는. 난 그냥 모든 값을 통해 게으른 시퀀스를 원한다. – Cumbayah

답변

15
(defn float-seqs [#^java.io.DataInputStream dis] 
    (lazy-seq 
    (try 
     (cons (.readFloat dis) (float-seqs dis)) 
     (catch java.io.EOFException e 
     (.close dis))))) 

(with-open [dis (-> file java.io.FileInputStream. java.io.DataInputStream.)] 
    (let [s (float-seqs dis)] 
    (doseq [f s] 
     (println f)))) 

전체 seq을 사용하려고 할 때 열어 본 상태로 사용할 필요는 없습니다.

with-open을 사용하는 경우 범위 밖에서 seq (또는 파생 된 seq)가 누출되지 않았는지 다시 확인하십시오.

+0

우아한. 고맙습니다. – Cumbayah

+0

위대한 : 그것은 내 마음에 게으른 seq의 사용을 조명. 마침내 클릭했습니다. –

관련 문제