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