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

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

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

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

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

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

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

Ответы на вопрос(5)

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

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

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

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

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

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

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

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

Компиляторы работают таким образом.

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

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

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

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

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

ВАШ ОТВЕТ НА ВОПРОС