Java 读取DataInputStream中大于UnsignedShort.MAX_值的UTF字符串

Java 读取DataInputStream中大于UnsignedShort.MAX_值的UTF字符串,java,utf-8,decoding,Java,Utf 8,Decoding,据我所知,DataInputStream是使用Modified-UTF8反序列化字符串的唯一方法。不幸的是,字符串的大小有一个限制,因为长度是无符号的短字符串 使用Modified-UTF8的主要动机是Java 8不再允许3字节代理项/6字节代理项对,因此以下代码无法正常运行(在具有这些代理项的字符串上): 但是,此代码可以正常工作: ByteBuffer bb = ByteBuffer.allocate(len + 2); bb.putShort((short) len).put(nonNul

据我所知,DataInputStream是使用Modified-UTF8反序列化字符串的唯一方法。不幸的是,字符串的大小有一个限制,因为长度是无符号的短字符串

使用Modified-UTF8的主要动机是Java 8不再允许3字节代理项/6字节代理项对,因此以下代码无法正常运行(在具有这些代理项的字符串上):

但是,此代码可以正常工作:

ByteBuffer bb = ByteBuffer.allocate(len + 2);
bb.putShort((short) len).put(nonNullValue, offset, len);

ByteArrayInputStream bis = new ByteArrayInputStream(bb.array());
DataInputStream dis = new DataInputStream(bis);

assertEquals(surrogatePairs, dis.readUTF()); // OK
这种方法的问题是没有限制字符串的大小,因此如果字符串的长度超过无符号短字符串的长度,它将无法正常工作


是否有其他方法可以使用3字节代理项/6字节代理项对反序列化字符串?编码的数据被保护为UTF-8,如果它解决了一个字符串超过整数的问题。Max值/ 2。< /P> + 1,我会考虑从DATAN中拷贝代码并处理任何需要的长度。@ PeterLawrey Yea,我试过了,效果很好。我的问题只是许可证问题。也许开放JDK实现会很好。同意。代码应该是相同的,只是以防万一。。。。
ByteBuffer bb = ByteBuffer.allocate(len + 2);
bb.putShort((short) len).put(nonNullValue, offset, len);

ByteArrayInputStream bis = new ByteArrayInputStream(bb.array());
DataInputStream dis = new DataInputStream(bis);

assertEquals(surrogatePairs, dis.readUTF()); // OK