1

Camelでファイルにバイト配列を書きたいです。しかし、配列を元に戻すために、行ごとに、または別の区切り記号で書きたいと思います。Camel でそれを行う方法は?

from(somewhere)
    .process(new Processor() {

      @Override
      public void process(final Exchange exchange) throws Exception {
        final MyObject body = exchange.getIn().getBody(MyObject.class);

        byte[] serializedObject = MySerializer.serialize(body);
        exchange.getOut().setBody(serializedObject);

        exchange.getOut().setHeader(Exchange.FILE_NAME, "filename");
      }
    }).to("file://filepath?fileExist=Append&autoCreate=true");

または、誰かがそれらを取り戻す別の方法を持っていますか?

PS : 必要なファイルは 1 つだけです。そうしないと簡単すぎてしまいます...

編集: out.writeObject メソッドを使用して、ファイルを 1 行ずつ正常に書き込みます (Petter に感謝します)。そして、私はそれらを読むことができます:

InputStream file = new FileInputStream(FILENAME);
InputStream buffer = new BufferedInputStream(file);
input = new ObjectInputStream(buffer);

Object obj = null;
while ((obj = input.readObject()) != null) {
        // Do something
}

しかし、ラクダでそれらを分割して読み取ることはできません。Camel でそれらを読むアイデアはありますか?

4

1 に答える 1

1

独自のシリアライザーがあるように見えるため、シリアライズされたオブジェクトがどのように見えるかによって異なります。標準のJavaバイナリですか

ByteArrayOutputStream bos = new ByteArrayOuputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(obj);
return bos.toByteArray();

\n のようなテキストベースのセパレーターを使用するのは、おそらくあまり良い考えではありません。

代わりにテキスト形式にシリアル化できませんか? Camel には使いやすいデータ形式がいくつかあります (http://camel.apache.org/data-format.html)。たとえば、Xstream はオブジェクトから XML を作成するための 1 行のコードであり、ファイルを複数の XML 部分に分割して XStream で読み戻すことは大したことではありません。

あなたの例では、セパレーターが本当に必要な場合は、それをバイト [] に追加してみませんか? 配列を新しい大きな byte[] にコピーし、最後に一意のシーケンスを挿入します。

于 2012-10-17T22:02:58.720 に答える