2012-10-17 3 views
1

Camel을 사용하여 파일에 바이트 배열을 쓰고 싶습니다. 그러나, 배열을 되찾기 위해서, 나는 한 줄씩 또는 다른 분리 자로 써야한다. 낙타로 어떻게 할 수 있습니까?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 
} 

그러나 낙타와 함께 그들을 읽을 수는 없습니다. 카멜로 그들을 읽을 생각이 있습니까?

답변

1

당신이 당신의 자신의 시리얼 라이저를 가지고 있기 때문에 그것은 당신의 직렬화 된 객체가 어떻게 생겼는지에 달려 있습니다. 표준 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을 사용하여 다시 읽어 들일 필요는 없습니다.

예에서 구분 기호를 실제로 사용하려면 바이트 []에 추가하지 않는 것이 좋습니다. 배열을 새로운 더 큰 바이트 []에 복사하고 끝에 고유 한 시퀀스를 삽입하십시오.

+0

가능한 한 파일을 작게 만들려고 Xml을 사용할 수 없습니다. 그리고 같은 파일에 여러 쓰레드가 있기 때문에 byte []를 더 넣을 수는 없습니다. – Pith

+0

맞습니다. 파일 크기를 고려하면 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이 (가) 고유 한 구분자 인 경우 다른 순서를 선택할 수 있습니다. –

+0

감사합니다. 파일을 성공적으로 작성했지만 읽을 수 없습니다. 내 편집을 보아라. – Pith

관련 문제