Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用;渠道;及;“缓冲区”;在尼奥_Java_Sockets_Buffer_Nio - Fatal编程技术网

Java 使用;渠道;及;“缓冲区”;在尼奥

Java 使用;渠道;及;“缓冲区”;在尼奥,java,sockets,buffer,nio,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) {

我的课本中有以下示例:

 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包中的
通道

  • 我想知道使用这个类如何提高性能?如果我只使用了
    System.out.println
    ,它会变慢吗

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


  • 1.这段代码如下所示<代码>系统.out.println()写入。比较他们的速度毫无意义。2.这是可选的。@EJP:为什么NIO不像IO套接字那样提供getOutputStream之类的流方法,而是只对缓冲区进行读写?因为正如您自己所说,通道不是面向流的,而且流API对通道没有用处:例如,
    write()
    不返回计数,这在非阻塞模式中是必需的。