File 使用Camel逐行写入和读取文件
我想用Camel在一个文件中写一个字节数组。但是,为了取回数组,我想一行一行地写它们,或者使用另一个分隔符。 用骆驼怎么做File 使用Camel逐行写入和读取文件,file,serialization,bytearray,apache-camel,File,Serialization,Bytearray,Apache Camel,我想用Camel在一个文件中写一个字节数组。但是,为了取回数组,我想一行一行地写它们,或者使用另一个分隔符。 用骆驼怎么做 from(somewhere) .process(new Processor() { @Override public void process(final Exchange exchange) throws Exception { final MyObject body = exchange.getIn().getBody
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方法成功地逐行写入了文件(多亏了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读取它们吗?这取决于序列化对象的外观,因为你似乎有自己的序列化程序。它是标准的java二进制文件吗
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");
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,那么将文件拆分为几个XML部分并用Xstream读回也没什么大不了的
在您的示例中,如果确实需要分隔符,为什么不将其附加到字节[]中呢?将数组复制到一个新的更大的字节[],并在末尾插入一些唯一的序列 这取决于序列化对象的外观,因为您似乎有自己的序列化程序。它是标准的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,那么将文件拆分为几个XML部分并用Xstream读回也没什么大不了的
在您的示例中,如果确实需要分隔符,为什么不将其附加到字节[]中呢?将数组复制到一个新的更大的字节[],并在末尾插入一些唯一的序列 我不能使用Xml,因为我想要一个尽可能小的文件。我不能把字节[]放在更大的地方,因为我有多个线程在同一个文件中写入。如果你考虑文件大小,XML是臃肿的。看看JSON,它更苗条,但仍然基于文本。为什么不能在字节[]的末尾添加一些分隔符字节?甚至在写入文件之前
byte[]serObj=Arrays.CopyTo(serializedObject,serializedObject.length+3);serObj[serializedObject.length]=(字节)'\n';serObj[serializedObject.length+1]=(字节)'\n';serObj[serializedObject.length+2]=(字节)'\n'代码>如果\n\n\n是唯一的分隔符,您可能需要选择其他序列。谢谢,我成功地编写了文件,但无法读取它。请看我的编辑。我不能使用Xml,因为我想要一个尽可能小的文件。我不能把字节[]放在更大的地方,因为我有多个线程在同一个文件中写入。如果你考虑文件大小,XML是臃肿的。看看JSON,它更苗条,但仍然基于文本。为什么不能在字节[]的末尾添加一些分隔符字节?甚至在写入文件之前byte[]serObj=Arrays.CopyTo(serializedObject,serializedObject.length+3);serObj[serializedObject.length]=(字节)'\n';serObj[serializedObject.length+1]=(字节)'\n';serObj[serializedObject.length+2]=(字节)'\n'代码>如果\n\n\n是唯一的分隔符,您可能需要选择其他序列。谢谢,我成功地编写了文件,但无法读取它。请看我的编辑