У меня есть 40-мегабайтный файл на диске, и мне нужно "сопоставить" его в памяти с помощью байтового массива.
Сначала я подумал, что написать файл в ByteArrayOutputStream будет лучшим способом, но я считаю, что в какой-то момент во время операции копирования требуется около 160 МБ кучного пространства.
Знает ли кто-нибудь лучший способ сделать это, не используя в три раза размер файла ОЗУ?
Обновление: Спасибо за ваши ответы. Я заметил, что я мог уменьшить потребление памяти, немного сказав, что начальный размер ByteArrayOutputStream будет немного больше исходного размера файла (с использованием точного размера с моим перераспределением сил кода, чтобы проверить, почему).
Там еще одно место высокой памяти: когда я получаю байт [] обратно с ByteArrayOutputStream.toByteArray. Взглянув на его исходный код, я вижу, что он клонирует массив:
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
Я думаю, что могу просто расширить ByteArrayOutputStream и переписать этот метод, чтобы вернуть исходный массив напрямую. Есть ли потенциальная опасность здесь, если поток и массив байтов не будут использоваться более одного раза?