Карта памяти напрямую в строку - PullRequest
2 голосов
/ 29 апреля 2011

У меня есть файл, который я отображаю в памяти через 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 ++, что отображаемые в память файлы передаются пользователю как указатели на память. Так есть ли хороший способ пропустить использование байтового массива и просто выполнить преобразование строк сразу из отображенной памяти?

Ответы [ 3 ]

3 голосов
/ 30 апреля 2011

Я предлагаю:

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

Также возможно использовать mapped.asCharBuffer () и получать символы таким образом.

3 голосов
/ 29 апреля 2011

В конечном итоге, нет.Но есть способ получить представление о данных в виде символов.Посмотрите на ByteBuffer.asCharBuffer ().

Внутри метод asCharBuffer () делает то же самое, что вы предлагаете, но на индивидуальной основе.

1 голос
/ 29 апреля 2011

Стринге не нужно обойтись без частной копии данных. Строки являются неизменяемыми, и если бы он использовал общий массив, вы могли бы это сломать. К сожалению, нет конструктора String(CharSequence) или String(ByteBuffer).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...