Отправить файл через сокет с заголовком с помощью одного системного вызова в Java

У меня огромный файл, пытаюсь отправить часть этого файла с заголовком и трейлером. (заголовок + часть этого файла + конечные данные)

Очевидным решением является SocketChannel.write(), который включает в себя несколько системных вызовов. Итак, я открыт для предложений.

Одним из вариантов может быть FileChannel.transferTo(), но он не позволяет добавлять какие-либо данные до или после, поэтому он включает как минимум 3 системных вызова.

Есть ли другой эффективный способ сделать это на Java? Может быть, похоже на реализацию sendFile во FreeBSD: https://www.freebsd.org/cgi/man.cgi?query=sendfile&sektion=2

1 ответ

Решение

Вы можете использовать MappedByteBuffer с разбросом / сборкой ввода-вывода.

Производительность отправки будет ближе к TransferTo(), так как mmap также использует буферы ядра, аналогичные вызову sendFile().

Половина псевдокода здесь, с одним вызовом записи:

MappedByteBuffer fileBuf = FileChannel.map(....);

ByteBuffer header  = ...;
ByteBuffer trailer = ...;
ByteBuffer slice   = fileBuf.slice(); // Set limit and position before slice

socketChannel.write(new ByteBuffer[]{header, slice, trailer}, 0, 3);
Другие вопросы по тегам