我正在为我的Trident拓扑实现一个IBackingMap,以便将元组存储到ElasticSearch(我知道GitHub上已存在多个Trident/ElasticSearch集成实现,但我决定实现一个更适合我的任务的自定义实现).
所以我的实现是一个经典的工厂:
public class ElasticSearchBackingMap implements IBackingMap<OpaqueValue<BatchAggregationResult>> {
// omitting here some other cool stuff...
private final Client client;
public static StateFactory getFactoryFor(final String host, final int port, final String clusterName) {
return new StateFactory() {
@Override
public State makeState(Map conf, IMetricsContext metrics, int partitionIndex, int numPartitions) {
ElasticSearchBackingMap esbm = new ElasticSearchBackingMap(host, port, clusterName);
CachedMap cm = new CachedMap(esbm, LOCAL_CACHE_SIZE);
MapState ms = OpaqueMap.build(cm);
return new SnapshottableMap(ms, new Values(GLOBAL_KEY));
}
};
}
public ElasticSearchBackingMap(String host, int port, String clusterName) …Run Code Online (Sandbox Code Playgroud) 代码段:
public static void main(String[] args) {
String s = "qwertyuiop";
System.out.println(Arrays.toString(Charset
.forName("UTF-8")
.encode(s)
.array()));
}
Run Code Online (Sandbox Code Playgroud)
打印:
[113, 119, 101, 114, 116, 121, 117, 105, 111, 112, 0]
Run Code Online (Sandbox Code Playgroud)
这似乎发生了,因为在引擎盖下,在java.nio.charset.CharsetEncoder类中,averageBytesPerChar变量对于UTF-8似乎是1.1.因此它分配11个字节而不是10个字节,如果输入字符串只包含好的旧单字节字符,我最后得到奇数空字符.
我想知道这是否记录在任何地方?
这一页:
https://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html#encode(java.lang.String)
没有提供有关此类行为的线索.
PS我是否正确无论如何,上述代码段最好由以下代码替换:
s.getBytes(StandardCharsets.UTF_8)
Run Code Online (Sandbox Code Playgroud)
我从它的来源看到的还修剪结果以避免那些空字符?
那么,java.nio.charset.Charset的编码(String s)应该用于什么?