Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用java或clojure解码bson_Java_Clojure_Bson - Fatal编程技术网

如何用java或clojure解码bson

如何用java或clojure解码bson,java,clojure,bson,Java,Clojure,Bson,我想把BSON文件解码成Clojure地图 这是我的代码: (ns decode (:require [clojure.java.io :as cji]) (:import [org.bson BasicBSONObject BasicBSONEncoder BasicBSONDecoder])) (defonce encoder (BasicBSONEncoder.)) (defonce decoder (BasicBSONDecoder.)) (defn read-file [

我想把BSON文件解码成Clojure地图

这是我的代码:

(ns decode
  (:require [clojure.java.io :as cji])
  (:import [org.bson BasicBSONObject BasicBSONEncoder BasicBSONDecoder]))

(defonce encoder (BasicBSONEncoder.))

(defonce decoder (BasicBSONDecoder.))

(defn read-file [file-path]
  (with-open [reader (cji/input-stream file-path)]
    (let [length (.length (clojure.java.io/file file-path))
          buffer (byte-array length)]
      (.read reader buffer 0 length)
      buffer)))


(defn bson2map [^Byte b]
  (->> (.readObject decoder b) (.toMap) (into {})))

(defn read-bson
  [path]
 (clojure.walk/keywordize-keys (bson2map (read-file path))))
但是当我解码像这样的BSON文件时(r/read BSON“test.BSON”),它只解码第一条记录,我想解码所有记录。
test.bson
太大。我如何把它破译成碎片


然后我发现了一个名为
LazyBSONDecoder
的类,编写了一些java代码,它可以对所有记录进行解码

import org.bson.LazyBSONDecoder;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Main {

    public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream("./_Installation.bson");
        LazyBSONDecoder decoder = new LazyBSONDecoder();
        Object obj;
        int count = 0;
        try {
            do {
                obj = decoder.readObject(in);
                System.out.println(obj);
                count++;
            } while (obj != null);
        } catch (Exception e) {
            // ignore
        }
        System.out.println(count);
    }
}

因此,我更改了Clojure代码,将
BasicBondeCoder
替换为
LazyBSONDecoder
,但它总是只解码第一条记录

(defonce decoder (LazyBSONDecoder.))

(defn bson2map [^Byte b]
  (do (print (.readObject decoder b))
      (print (.readObject decoder b))
      (print (.readObject decoder b))))
请看这个代码


函数
bson2map
参数应该是一个inputStream而不是一个字节数组,如果它是字节数组,它将返回一个新的
ByteArrayInputStream
,所以我总是得到第一条记录。

Java版本有一个
do
/
循环,而Clojure版本只调用
readObject
方法一次。@myguidingstar在上一个示例中有三个调用
.readObject
,但根据OP,第一条记录会在所有这些方法上返回。@iPaumian你能吗提供一个BSON文件示例来检查问题是什么?这会有帮助吗:?@tolitius@juan.facoorro谢谢你给我一些建议,我已经解决了问题,函数
bson2map
参数应该是一个输入流,而不是字节数组。
(defonce decoder (LazyBSONDecoder.))

(defn bson2map [^Byte b]
  (do (print (.readObject decoder b))
      (print (.readObject decoder b))
      (print (.readObject decoder b))))