2013-10-30 2 views
1

우리는 구매 데이터를 수신하고 해당 데이터를 HDFS에 기록하기 위해 Java REST-API를 구축했습니다. ,FSDataOutputStream을 사용하여 Java REST-API에서 HadoopDFS로 작성된 원하지 않는 문자

1 public synchronized void writeToFile(String filename, String hostname, String content) throws IOException { 
2 FSDataOutputStream stream = registry.getStream(filename, hostname); 
3 stream.writeBytes(content); 
4 stream.hflush(); 
5 } 

첫째 : 은 본질적으로 우리는 (JSON에서) 데이터를 전송하는 모든 호스트에 대한 스트림을 열거 나, 기존 사용 타임 스탬프, 이벤트 이름과 호스트 이름으로 데이터를 풍부하게하고 (FS) DataOutputStream 정렬로 쓰기 우리는 라인 3에서 stream.writeChars(content)을 사용하여 다음과 같은 파일을 만들었습니다. .{.".m.e.s.s.a.g.e.".:.".h.e.l.l.o.".} DataOutputStream.writeChars (String s)의 구현을 살펴보면 오른쪽으로 8 비트 이동이 표시되고 모든 char에 대해 선행 x00이 추가됩니다 이해하지 마라.

가 그럼 난 라인 3 stream.writeUTF(content)을 시도, 파일은 훨씬 더 보았다 : 여전히 .W{"message":"hello"} 그러나, 몇 바이트를 많은. 코드를 살펴보면, writeUTF (String s)는 s의 바이트 수를 먼저 보낸 다음 문자열 자체를 보냅니다. 따라서 .W은 이벤트 데이터의 바이트 수를 나타냅니다. 이벤트 데이터의 길이를 변경하면 파일의 다른 선행 문자가 나타납니다.

그럼 최후의 수단은 stream.writeBytes(content)입니다. 여기에 모든 것이 잘 보였습니다. {"message":"hello"} 특수 문자가 나타날 때까지 {"message":"hallöchen"}{"message":"hall.chen"}이되었습니다. writeBytes는 문자를 쓰기 전에 문자의 앞부분 8 비트를 자릅니다. 이 문자를 올바르게 작성하려면 UTF-8 기능이 필요하다고 생각합니다.

그래서 지금은 좀 잃어 버렸습니다. 어떻게 해결할 수 있습니까?

답변

0

이 글을 읽을 때 : Why does DataOutputStream.writeUTF() add additional 2 bytes at the beginning? 내가 언급 한 FSDataOutputStream 메소드가이 기능을 수행하지 못한다고 느꼈습니다. 빠른 (그리고 어쩌면 더러운) 솔루션은 이것이다 :

3 byte[] contentAsBytes = content.getBytes("UTF-8"); 
4 for (byte singleByte : contentAsBytes) { 
5 stream.writeByte(singleByte); 
6 } 

클리너 방법은 FSDataOutputStream 사용하지 않는 것,하지만 난 대안을 찾을 수 없습니다. 힌트를 남겨주세요.

0

java.io.PrintStream에서 FSDataOutputStream을 래핑하고 해당 인쇄 메소드를 사용해 보았습니다. 그것은 장거리지만 그것이 당신을 위해 작동하는지 알려주십시오.