我对在零拷贝操作中使用Channels.newChannel(OutputStream/InputStream)有一些疑问。它会作为零拷贝吗?我有一些限制,如必须发送第一个头部分(文件和用户相关信息),然后文件内容。为了测试,我也覆盖了BufferedOutputStream,但是在fileChannel上。transferTo调用,它正在调用我的重写方法…请告诉我如何在这种情况下实现零拷贝(头+内容)。
测试代码部分:
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();
将作为零拷贝。
。您必须从SocketChannel
开始,而不是Socket,
,并直接在transferTo()
中使用它。
我有一些限制,比如必须发送第一个头部分(文件和用户相关信息)
你不能用零拷贝。
然后文件内容
你能做到的那部分。
注意,没有指定transferTo()
在单个调用中完成整个传输。您必须循环,注意返回值并相应地调整偏移量,直到全部完成。