Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用双缓冲从ByteBuffer读取字符串_Java_Optimization_Nio_Bytebuffer - Fatal编程技术网

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?”我们不能真正为你提供权威的答案,除非一位前太阳工程师碰巧在阅读……)