Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 使用Camel逐行写入和读取文件_File_Serialization_Bytearray_Apache Camel - Fatal编程技术网

File 使用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

我想用Camel在一个文件中写一个字节数组。但是,为了取回数组,我想一行一行地写它们,或者使用另一个分隔符。 用骆驼怎么做

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是唯一的分隔符,您可能需要选择其他序列。谢谢,我成功地编写了文件,但无法读取它。请看我的编辑