우리는 구매 데이터를 수신하고 해당 데이터를 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이 추가됩니다 이해하지 마라.
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 기능이 필요하다고 생각합니다.
그래서 지금은 좀 잃어 버렸습니다. 어떻게 해결할 수 있습니까?