2012-10-17 42 views
1

我想用骆驼在一个文件中写一个字节数组。但是,为了取回我的数组,我想将它们逐行写入,或使用另一个分隔符。 如何用骆驼做到这一点?用骆驼线逐行写入和读取文件

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:我需要有只有一个文件,否则它会一直太容易了......

编辑: 我写成功通过线我的文件符合out.writeObject方法(感谢皮特)。我可以阅读它们:

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

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

但我不能用骆驼拆分和阅读它们。你有什么想法用骆驼阅读它们吗?

回答

1

这取决于你的序列化对象的样子,因为你似乎有你自己的序列化程序。它是标准的Java二进制

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

我可能不会使用基于文本分隔符如\ n个这样的一个伟大的想法。

难道你不能序列化成一些文本格式吗?骆驼有几个易于使用的数据格式:(http://camel.apache.org/data-format.html)。例如,Xstream是一行代码,用于从您的对象中创建XML,然后将文件拆分为多个XML部分并使用XStream将其读回来并不算什么。

在你的例子中,如果你真的想要一个分隔符,为什么不把它附加到byte []?将数组复制到一个新的更大的字节[],并在最后插入一些唯一序列。

+0

我不能使用Xml,因为我想要一个尽可能小的文件。我不能把字节[]放在更大的位置,因为我有多个线程写入同一个文件。 – Pith

+0

如果考虑文件大小,则说明XML膨胀。看看JSON,它更纤薄,但仍然基于文本。为什么不能在字节[]的末尾添加一些分隔符字节?它甚至在写入文件之前。 'byte [] serObj = Arrays.CopyTo(serializedObject,serializedObject.length + 3); serObj [serializedObject.length] =(byte)'\ n'; serObj [serializedObject.length + 1] =(byte)'\ n'; serObj [serializedObject.length + 2] =(byte)'\ n'; ' 如果\ n \ n \ n是唯一的分隔符,您可能需要选择其他序列。 –

+0

谢谢,我成功地写了我的文件,但我无法读取它。请参阅我的编辑 – Pith