Подтвердить что ты не робот

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

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

byte[] big  = new byte[1000];

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

byte[100] sub = big + 200; 

// C-style code ends

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

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

  • Или написать собственный класс, который будет ссылаться на большой размер + смещение + и реализовать "подмашину" с помощью методов доступа, используя большие, как фактическую базовую структуру данных.

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

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

4b9b3361

Ответ 1

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

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

Никакое копирование не связано (хотя некоторые создания объектов). В качестве стандартного класса библиотеки я также предполагаю, что ByteBuffer, скорее всего, получит специальное лечение. "JIT" оптимизация JVM, чем обычная.

Ответ 2

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

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

Ответ 3

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

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

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

  • значение
  • смещение
  • Количество
Подстрока

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

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

Ответ 4

Чтение файла в память хорошо, так как скоро файл становится относительно маленьким. Но когда вам приходится иметь дело с огромными файлами, хранение их в памяти является гораздо более желательной целью.

MappedByteBuffer - это то, что вы ищете.

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