Отправить файл через сокет с заголовком с помощью одного системного вызова в Java - PullRequest
0 голосов
/ 17 мая 2018

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

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

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

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

1 Ответ

0 голосов
/ 17 мая 2018

Вы можете использовать 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);
...