Если вам не разрешено увеличивать размер кучи из-за содержания памяти, выполнение выделения памяти «под таблицей» вызовет те же проблемы. Похоже, вы ищете лазейку в правилах. Например: «Мой доктор говорит, чтобы сократить количество еды во время каждого приема пищи, поэтому я ем больше между приемами пищи, чтобы компенсировать это».
Единственный известный мне способ выделения памяти без использования кучи Java - это писать вызовы JNDI для выделения памяти с C. Но тогда как бы вы использовали эту память? Вы должны написать больше вызовов JNDI для взаимодействия с ним. Я думаю, что вы в конечном итоге заново изобретаете Java.
Если цель здесь - отправить большой файл, просто используйте буферизованные потоки и читайте / записывайте его по одному байту за раз. Буферизованный поток, как следует из названия, позаботится о буферизации для вас, так что вы на самом деле не ударяете по жесткому диску по одному байту за раз. Это будет действительно читать, я думаю, что по умолчанию 8k за один раз, а затем передать эти байты вам, когда вы их просите. Аналогично, на стороне записи это сэкономит несколько килобайт и отправит их всех порциями.
Так что все, что вам нужно сделать, это открыть BufferedInputStream и BufferedOutputStream. Затем напишите цикл, который читает один байт из входного потока и записывает его в выходной поток, пока вы не достигнете конца файла.
Что-то вроде:
OutputStream os=... however you're getting your socket ...
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(fileObject));
BufferedOutputStream bos=new BufferedOutputStream(os);
int b;
while ((b=bis.read())!=-1)
bos.write(b);
bis.close();
bos.close();
Нет необходимости усложнять себе жизнь, заново изобретая буферизацию.
время (