Java 不使用双缓冲从ByteBuffer读取字符串
有没有一种方法可以从Java 不使用双缓冲从ByteBuffer读取字符串,java,optimization,nio,bytebuffer,Java,Optimization,Nio,Bytebuffer,有没有一种方法可以从ByteBuffer构造字符串,而无需首先将内容从缓冲区读取到中间字节[]或字符[] 我觉得类似的API非常理想: public String(ByteBuffer buffer, int offset, int length, Charset charset) 。。。但这种事情并不存在 我找到了,但它使用了一个辅助数组 到目前为止,我发现的第二个最好的方法是将字节缓冲区投影为CharBuffer并调用。但是这不允许使用类似于UTF-8的东西来压缩字符串,因为没有这样的东西
ByteBuffer
构造字符串
,而无需首先将内容从缓冲区读取到中间字节[]
或字符[]
我觉得类似的API非常理想:
public String(ByteBuffer buffer, int offset, int length, Charset charset)
。。。但这种事情并不存在
我找到了,但它使用了一个辅助数组
到目前为止,我发现的第二个最好的方法是将字节缓冲区投影为
CharBuffer
并调用。但是这不允许使用类似于UTF-8
的东西来压缩字符串,因为没有这样的东西
ByteBuffer不包含字符。它们必须先转换为字符,然后才能生成字符串
此外,字符串必须位于JVM内存中。ByteBuffer可以是映射的或直接的,在这两种情况下它都在JVM之外
为了将数据移动到JVM中并将其转换为字符,您必须使用一个辅助数组。如何处理并调用返回的数据。java.lang.String是不可变的和最终的,因此最终别无选择,只能以它已经接受的格式提供数据。(当然,除了通过反射操作其内部构件……)
你可以把丑陋隐藏在使用字符串生成器或其他东西的API后面,但在某个时候内存中会有两个数组副本,一个在生成器中,另一个用于实际字符串。
string
是由char
s组成的,而不是byte
s。您需要一个字符集,用于将字节转换为字符,例如UTF-8、UTF-16、ISO-8859-1、ISO-8859-5等
如果你不知道字符集,你就不知道字节代表哪个字符。你的ByteBuffer支持array()方法吗?它是内存映射的,所以我不这么认为。但这些都是错综复杂的,我想让我用什么API来理解它们。我对你们想要实现什么感到困惑。您可以使用
array
方法获取ByteBuffer
的后备字节数组。除了不想依赖内部实现细节之外,您的最终目标是什么?@Perception,array
是一个可选操作,如果此缓冲区没有可访问的数组支持,则可以抛出UnsupportedOperationException。我想如果ByteBuffer是一个1GB内存映射文件,就会发生同样的事情。字节数组备份的ByteBuffer
s是毫无意义的(为什么不直接使用Byte[]
s);因此,我们可以合理地假设您可能正在使用本机缓冲区。是的,但我不明白为什么字符串不能在构造函数中这样做。为什么要在高性能的API中强制使用额外的数组拷贝呢?这对性能没有好处,只是在已经相当复杂的API中增加了复杂性。我同意。但这就是为什么我的梦想API需要一个字符集。。。例如,请参阅Sun JDK 1.6.0_u34中的我的作品,java.lang.String
有一个包私有构造函数,如下所示:/*包私有构造函数共享值数组以提高速度。*/字符串(int-offset,int-count,char-value[]){…}
在我看来,java.lang
中的API可以避免第二个数组…是的,所以如果您使用反射覆盖对该构造函数的访问,您可以这样做,正如我提到的:)LOL,nods。反省会破坏这里的目的。但是包私有意味着同一包中的其他类可以使用构造函数,而不需要任何愚蠢的操作。这个API似乎被明确地保留下来用于优化。我希望他们能用给他们的冷静……好吧,如果真正的问题只是“为什么太阳没有做XYZ?”我们不能真正为你提供权威的答案,除非一位前太阳工程师碰巧在阅读……)