Java-создание байтового массива, размер которого представлен длинным

Я пытаюсь создать массив байтов, размер которого long . Например, подумайте об этом как о:

 long x = _________; byte[] b = new byte[x]; 

По-видимому, вы можете указать только int для размера байтового массива.

Прежде чем кто-нибудь спросит, зачем мне нужен массив байтов настолько большой, я скажу, что мне нужно инкапсулировать данные форматов сообщений, которые я не пишу, и один из этих типов сообщений имеет длину unsigned int ( long in Java).

Есть ли способ создать этот массив байтов?

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

(Вероятно, это немного поздно для OP, но это может быть полезно для других)

К сожалению, Java не поддерживает массивы с более чем 2 31 -1 элементами. Максимальное потребление составляет 2 гигабайта пространства для массива byte[] или 16 гигабайт пространства для long[] массива.

Хотя это, вероятно, неприменимо в этом случае, если массив будет разреженным , вы можете уйти с использованием ассоциативной структуры данных, такой как Map чтобы сопоставить каждое используемое смещение с соответствующим значением. Кроме того, Trove обеспечивает более экономичную реализацию памяти для хранения примитивных значений, чем стандартные коллекции Java.

Если массив не разрежен и вам действительно нужен действительно весь блоб в памяти, вам, вероятно, придется использовать двумерную структуру, например, с сопоставлением сопоставления по модулю 1024 с соответствующим 1024-байтовым массивом. Такой подход может быть более эффективным с точки зрения памяти даже для разреженных массивов, поскольку смежные заполненные ячейки могут использовать одну и ту же запись в Map .

byte[] с размером максимального 32-разрядного целого числа со знаком потребует 2 ГБ смежного адресного пространства. Вы не должны пытаться создать такой массив. В противном случае, если размер на самом деле не такой большой (и это просто больший тип), вы можете смело применить его к int и использовать его для создания массива.

Вероятно, вы должны использовать stream для чтения своих данных, а другой – для его записи. Если вы хотите получить доступ к данным позже в файле, сохраните его. Если вам нужен доступ к чему-то, с которым вы еще не столкнулись, вам нужна двухпроходная система, в которой вы запускаете один раз и сохраняете «материал, который вам понадобится для второго прохода, а затем снова выполняйте».

Составители работают таким образом.

Единственный случай для загрузки во всем массиве сразу – если вам приходится неоднократно произвольно обращаться ко многим местоположениям по всему массиву. Если это так, я предлагаю вам загрузить его в несколько байт-массивов, хранящихся в одном classе контейнера.

Класс контейнера будет иметь массив байтовых массивов, но извне все обращения будут казаться смежными. Вы просто попросите байта 49874329128714391837, и ваш class разделит ваш Long на размер каждого байтового массива, чтобы вычислить, какой массив нужно получить, а затем использовать остаток для определения байта.

Он также может иметь методы для хранения и извлечения «кусков», которые могут охватывать границы массива байтов, которые потребуют создания временной копии, – но затраты на создание нескольких временных массивов были бы более чем компенсированы тем фактом, что вы не У меня есть заблокированное пространство размером 2 ГБ, которое, я думаю, может просто разрушить вашу производительность.

Изменить: ps. Если вам действительно нужен случайный доступ и вы не можете использовать streamи, то реализация содержащего classа – очень хорошая идея. Это позволит вам изменить реализацию «на лету» из одного байтового массива в группу массивов байт в файловую систему без каких-либо изменений в остальной части вашего кода.

Это не немедленная помощь, но создание массивов с большими размерами (через longs) – это предлагаемое изменение языка для Java 7. Ознакомьтесь с предложениями проекта Coin для получения дополнительной информации

Один из способов «сохранить» массив – записать его в файл, а затем получить к нему доступ (если вам нужно получить доступ к нему, как массив) с помощью RandomAccessFile. Api для этого файла использует long как индекс в файле вместо int. Это будет медленнее, но гораздо меньше в памяти.

Это когда вы не можете извлечь то, что вам нужно во время первоначального сканирования ввода.

  • Асинхронный доступ к массиву в Firebase
  • Адрес массива
  • Как печатать содержимое массива по горизонтали?
  • Java: multidimensional array против одномерного
  • Как преобразовать jsonString в JSONObject в Java
  • JavaScript - почему Array.prototype.fill фактически заполняет «указатель» объекта при заполнении чего-либо типа «новый объект ()»
  • Могу ли я взять адрес элемента «один конец прошлого» массива?
  • Есть ли способ мгновенно генерировать массив, заполненный диапазоном значений в Swift?
  • Java-массивы печатают странные цифры и текст
  • Генератор случайных чисел в C # - уникальные значения
  • Глубокая копия массива объектов
  • Давайте будем гением компьютера.