Java NIO系列教程(2):Channel

hubuke 8年前
   <p>Java NIO的通道类似流,但又有些不同:</p>    <ul>     <li>既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。</li>     <li>通道可以异步地读写。</li>     <li>通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。</li>    </ul>    <p>正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:</p>    <p><img alt="Java NIO系列教程(2):Channel" src="https://simg.open-open.com/show/654a17932b5ea308f73200f077e6a4cb.png" width="338" height="231"></p>    <h3>Channel的实现</h3>    <p>这些是Java NIO中最重要的通道的实现:</p>    <ul>     <li>FileChannel</li>     <li>DatagramChannel</li>     <li>SocketChannel</li>     <li>ServerSocketChannel</li>    </ul>    <p>FileChannel 从文件中读写数据。</p>    <p>DatagramChannel 能通过UDP读写网络中的数据。</p>    <p>SocketChannel 能通过TCP读写网络中的数据。</p>    <p>ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。</p>    <h3>基本的 Channel 示例</h3>    <p>下面是一个使用FileChannel读取数据到Buffer中的示例:</p>    <pre>  <code class="language-java">RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");    FileChannel inChannel = aFile.getChannel();      ByteBuffer buf = ByteBuffer.allocate(48);      int bytesRead = inChannel.read(buf);    while (bytesRead != -1) {      System.out.println("Read " + bytesRead);    buf.flip();      while(buf.hasRemaining()){    System.out.print((char) buf.get());    }      buf.clear();    bytesRead = inChannel.read(buf);    }    aFile.close();</code></pre>    <p> </p>    <p>注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。</p>    <p>译文出处: <a href="/misc/goto?guid=4959669892272126466">郭蕾</a>   原文出处:<a href="/misc/goto?guid=4959669891323455726" rel="nofollow">Jakob Jenkov</a></p>