使用 FSDataOutputStream 将不需要的字符从 java REST-API 写入 HadoopDFS

2024-04-11

我们构建了一个 java REST-API 来接收事件数据(例如单击购买按钮)并将该数据写入 HDFS。 本质上,我们为发送数据(以 JSON 形式)的每个主机打开流,或者使用现有的流,使用时间戳、事件名称和主机名丰富数据,并将其写入 (FS)DataOutputStream:

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  }

首先,我们使用了stream.writeChars(content)在第 3 行中,生成如下文件:.{.".m.e.s.s.a.g.e.".:.".h.e.l.l.o.".}查看 DataOutputStream.writeChars(String s) 的实现,您会看到向右移动 8 位,并为每个字符添加前导 x00,原因我不明白。

然后我尝试了stream.writeUTF(content)在第 3 行中,文件看起来好多了:.W{"message":"hello"}但仍然是几个字节到很多字节。查看代码,writeUTF(String s) 首先发送 s 中的字节数,然后发送字符串本身。所以.W表示事件数据中的字节数,当改变事件数据的长度时证明文件中显示不同的前导字符。

所以我最后的手段是stream.writeBytes(content)。这里一切看起来都很好:{"message":"hello"}直到特殊字符开始发挥作用:{"message":"hallöchen"} became {"message":"hall.chen"}。 writeBytes 在写入之前切掉字符的前 8 位。我想我需要一些 UTF-8 功能才能正确写入这些字符。

所以,现在我有点迷失了。我该如何解决这个问题?


当我读到这篇文章时:为什么 DataOutputStream.writeUTF() 在开头添加额外的 2 个字节? https://stackoverflow.com/questions/7630242/why-does-dataoutputstream-writeutf-add-additional-2-bytes-at-the-beginning?rq=1我觉得提到的 FSDataOutputStream 方法不适用于此。 一个快速(可能是肮脏的)解决方案是这样的:

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

更干净的方法是不使用 FSDataOutputStream,但我找不到替代方法。 任何提示仍然值得赞赏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 FSDataOutputStream 将不需要的字符从 java REST-API 写入 HadoopDFS 的相关文章

随机推荐