使用Camel读取文件中的对象?

时间:2012-10-18 14:04:04

标签: java apache-camel objectinputstream

我有一个包含java对象的文件,用以下代码编写:

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

          @Override
          public void process(final Exchange exchange) {
              ...
              ByteArrayOutputStream bos = new ByteArrayOutputStream();
              ObjectOutput out = new ObjectOutputStream(bos);
              out.writeObject(myObject);
              exchange.getOut().setBody(bos.toByteArray());
          }
     }).to("file://pathFile");

现在,我想快速阅读。我不知道怎么能这样做,就像下面的代码一样。

from("file://pathFile").convertBodyTo(String.class)

.split(body().tokenize("???")) // How can I tokenize my file ?

.streaming().threads(2)

.process(new Processor() {

      @Override
      public void process(final Exchange exchange) {
        String filePath = (String) exchange.getIn().getHeader(Exchange.FILE_PATH);
        File file = new File(filePath);
        MyObject myObject = null;
        try {
          FileInputStream fis = new FileInputStream(file);
          InputStream buffer = new BufferedInputStream(fis);
          ObjectInput input = new ObjectInputStream(buffer);

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

        } catch (Exception e) {
            ...
        } finally {
          ...
        }
        exchange.getIn().setBody(myObject);
      }
}).to(somewhere);

编辑:我编辑自己阅读对象的方式。该代码仍然存在问题,我们无法附加到ObjectOutputStream。这将破坏流。这个问题有一个解决方案[这里]。我们只能写一次流标题。

但如果我这样做,我将无法拆分和读取多个线程的文件。 那么我可以在ObjectOutputStream标题上拆分或访问我的文件吗?

1 个答案:

答案 0 :(得分:1)

您刚刚使用convertBodyTo(String.class)将其转换为String,因此您在主体中有一个String而不是InputStream ....