Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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 内存直接映射到字符串_Java_Memory Mapped Files - Fatal编程技术网

Java 内存直接映射到字符串

Java 内存直接映射到字符串,java,memory-mapped-files,Java,Memory Mapped Files,我有一个文件正在通过“FileChannel.map()”映射到内存中。但是,在读取字符串时执行以下操作似乎有点奇怪: 1) read a int for the string length 2) allocate a byte[length] object 3) use .get to read length bytes 4) convert the byte[] to a string 现在我从C++背景中知道内存映射文件作为指针指向内存。那么,有没有一种好方法可以跳过使用字节数组,直接从

我有一个文件正在通过“FileChannel.map()”映射到内存中。但是,在读取字符串时执行以下操作似乎有点奇怪:

1) read a int for the string length
2) allocate a byte[length] object
3) use .get to read length bytes
4) convert the byte[] to a string

现在我从C++背景中知道内存映射文件作为指针指向内存。那么,有没有一种好方法可以跳过使用字节数组,直接从映射内存中进行字符串转换呢?

最终,没有。但是有一种方法可以将数据作为字符查看。请看ByteBuffer.asCharBuffer()


在内部,asCharBuffer()方法执行与您建议的相同的操作,但是是逐字符执行的。

没有任何字符串需要数据的私有副本。字符串是不可变的,如果它使用一个共享数组,您可以破坏它。不幸的是,没有
字符串(CharSequence)
字符串(ByteBuffer)
构造函数。

我建议:

MappedByteBuffer mapped = fileChannel.map(mode, position, size);
String s = new String(mapped.array());

也可以使用mapped.asCharBuffer()并通过这种方式获取字符。

这将在此时确定。目前它是ASCII.+1,这是他可能希望的最好的,如果文件是ASCII,因为Java字符串是Unicode..为了防止不必要的复制到缓冲区,这是一种方法。当然,制作一个字符串仍然需要一个副本,正如rliby所提到的……这样他就可以得到一个
不支持的操作异常
MappedByteBuffer
不受数组的支持,
MappedByteBuffer.hasArray()
返回
false
,而
MappedByteBuffer.array()
抛出上述异常。可能是真的,因此他需要使用asCharBuffer()并将每个字符读取到另一个缓冲区,然后构造字符串。