Отправить файл через сокет с заголовком с помощью одного системного вызова в 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);