В Java: где найти способ создать подмассив, который будет указывать на часть большего массива? - PullRequest
11 голосов
/ 06 марта 2009

Изучение Java, так что будьте нежны, пожалуйста. В идеале мне нужно создать массив байтов, который будет указывать на часть большего массива:

byte[] big  = new byte[1000];

// C-style code starts
load(file,big);

byte[100] sub = big + 200; 

// C-style code ends

Я знаю, что это невозможно в Java, и на ум приходят два обходных пути:

  1. Либо копирование части большой в суб итерацию по большой .

  2. Или написание собственного класса, который будет принимать ссылку на big + offset + size и реализацию «подмассива» через методы доступа, использующие big в качестве фактической базовой структуры данных .

Задача, которую я пытаюсь решить, - загрузить файл в память, а затем получить доступ только для чтения к записям, хранящимся в файле через класс. Скорость имеет первостепенное значение, поэтому в идеале я бы хотел избежать методов копирования или доступа. И так как я изучаю Java, я бы хотел придерживаться этого.

Какие-нибудь другие альтернативы у меня есть? Пожалуйста, задавайте вопросы, если я недостаточно хорошо объяснил задачу.

Ответы [ 3 ]

22 голосов
/ 06 марта 2009

Создание массива в качестве «представления» другого массива в Java невозможно. Но вы можете использовать java.nio.ByteBuffer , который в основном является классом, который вы предлагаете в обходном пути №2. Например:

ByteBuffer subBuf = ByteBuffer.wrap(big, 200, 100).slice().asReadOnlyBuffer();

Копирование не требуется (хотя создание объекта). Будучи стандартным библиотечным классом, я бы также предположил, что ByteBuffer с большей вероятностью получит специальную обработку в отношении. «JIT» оптимизация от JVM, чем пользовательская.

3 голосов
/ 06 марта 2009

Если вы хотите читать файл быстро и с низкоуровневым доступом, проверьте java nio. Вот пример из Java-альманаха .

Вы можете использовать отображенный байтовый буфер для навигации по содержимому файла.

1 голос
/ 06 марта 2009

Посмотрите на источник для java.lang.String (он будет в src.zip или src.jar). Вы увидите, что у них есть массив cahrs, а затем начало и конец. Итак, да, решение состоит в том, чтобы использовать класс для этого.

Вот ссылка на источник в сети .

Интересующие переменные:

  • значение * * 1 010
  • смещение
  • Количество

Подстрока, вероятно, является хорошим методом для рассмотрения в качестве отправной точки.

Если вы хотите читать directlry из файла, используйте класс java.nio.channels.FileChannel , в частности, метод map (), который позволит вам использовать ввод-вывод с отображением памяти, быть очень быстрым и использовать меньше памяти, чем копирование в массивы.

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