Channels.newChanne() поможет добиться фактической ZeroCopy

У меня есть некоторые сомнения относительно использования Channels.newChannel(OutputStream/InputStream) в операции zeroCopy. Будет ли это служить zeroCopy. У меня есть некоторые ограничения, такие как отправка первой части заголовка (информация о файле и пользователе), а затем содержимое файла. Для тестирования я также переопределяю BufferedOutputStream, но при вызове fileChannel.transferTo он вызывает мои методы переопределения... Пожалуйста, помогите мне, как достичь zeroCopy в таких обстоятельствах (заголовок + содержимое).

часть кода тестирования:

String host = "127.0.0.1";
SocketAddress sad = new InetSocketAddress(host, ZeroCopyServer.PORT);
Socket s=new Socket();
s.connect(sad);

OutputStream o=s.getOutputStream();
OutputStream out=new BufferedOutputStream(o);
WritableByteChannel ch=Channels.newChannel(o);
//can i use
//WritableByteChannel ch=Channels.newChannel(out);

String msg="Hi how are you and what are you doing...";
out.write(msg.getBytes());
out.flush();

String fname = "hello.txt";
String fname2 = "input";
long fileSize = new File(fname).length();

FileChannel fc = new FileInputStream(fname).getChannel();
FileChannel fc2 = new FileInputStream(fname2).getChannel();

fc.transferTo(0, fc.size(), ch);
fc2.transferTo(0, fc2.size(), ch);

fc.close();
fc2.close();
out.close();
ch.close();

1 ответ

Будет ли это служить zeroCopy.

Нет. Вы должны начать с SocketChannel для этого не Socket, и использовать его непосредственно в transferTo(),

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

Ну, вы не можете сделать это с нулевой копией.

затем содержимое файла.

Эту часть вы можете достичь.

Обратите внимание, что transferTo() не указано, чтобы сделать весь перевод за один звонок. Вы должны выполнить цикл, отмечая возвращаемое значение и корректируя смещение, пока все не будет сделано.

Другие вопросы по тегам