2012-10-18 85 views
1

我有一個包含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

你只需將它轉換爲使用convertBodyTo(String.class)一個字符串,因此你必須在身體,而不是一個InputStream一個String ....

+0

好吧,我知道我不應該使用'convertBodyTo(String.class) ',但我怎樣才能分割我的文件? '.split(body()。tokenize(「\ n」))'也不是一個好主意。但是我的文件可以包含數百萬個對象,所以我必須使用多線程來讀取它。 – Pith