Channels.newChannel()将有助于实现实际的零拷贝

时间:2014-06-26 05:19:48

标签: java zero-copy

我对在zeroCopy操作中使用Channels.newChannel(OutputStream / InputStream)有一些疑问。它会作为零复制吗?我有一些限制,比如必须发送第一个标题部分(文件和用户相关信息)然后文件内容。 为了测试,我也覆盖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 个答案:

答案 0 :(得分:0)

  

它是否会作为零复制。

没有。您必须以SocketChannel开头,而不是Socket,,并直接在transferTo()中使用。

  

我有一些限制,比如必须发送第一个标题部分(文件和用户相关信息)

嗯,你不能用零拷贝做到这一点。

  

然后是文件内容。

你可以实现这一部分。

请注意,transferTo()未指定在一次通话中执行整个转移。您必须循环,注意返回值并相应地调整偏移量,直到完成所有操作。