Вы не можете создавать строки с таким количеством символов.OutOfMemoryError
не потому, что куча была заполнена, а потому, что вы пытаетесь построить строку больше максимально возможного размера.
Максимально возможный размер определяется как 2 для степени 31, минус 1, минус 8. Это примерно 2 Гб, если вы используете только однобайтовые символы в файле.См. Источник AbstractStringBuilder
.
/**
* The maximum size of array to allocate (unless necessary).
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
Вы просто не можете создавать строки больше этого.
Почему вы хотите объединять файлы в памяти, когда вы можете присоединиться к ним во время их потоковой передачина диск?