使用"频道"和"缓冲区"在NIO

时间:2017-02-07 16:55:05

标签: java sockets buffer nio

我的教科书中有以下示例:

 1 import java.nio.*;
 2 import java.nio.channels.*;
 3 import java.net.*;
 4 import java.io.IOException;
 5 
 6 public class ChargenClient {
 7 
 8   public static int DEFAULT_PORT = 19;
 9 
10   public static void main(String[] args) {
11 
12     if (args.length == 0) {
13       System.out.println("Usage: java ChargenClient host [port]");
14       return;
15     }
16 
17     int port;
18     try {
19       port = Integer.parseInt(args[1]);
20     } catch (RuntimeException ex) {
21       port = DEFAULT_PORT;
22     }
23 
24     try {
25       SocketAddress address = new InetSocketAddress(args[0], port);
26       SocketChannel client = SocketChannel.open(address);
27 
28       ByteBuffer buffer = ByteBuffer.allocate(74);
29       WritableByteChannel out = Channels.newChannel(System.out);
30 
31       while (client.read(buffer) != -1) {
32         buffer.flip();
33         out.write(buffer);
34         buffer.clear();
35       }
36     } catch (IOException ex) {
37       ex.printStackTrace();
38     }
39   }
40 } 

它使用了第29行的NIO Java包中的Channels类。

  1. 我想知道如何使用这个类获得性能?如果我只使用System.out.println

  2. ,它会慢吗?
  3. 使用ByteBuffer类比使用Streams还是只选择?使用flip()rewind()可能会很方便,但如果我只想说write()没有缓冲区的套接字,我仍然可以这样做吗?我之所以感到困惑是因为我读过NIO是面向缓冲的而不是面向流的。

0 个答案:

没有答案