java NIO Channel 学习总结
Java NIO 的核心组成部分:
1.Channels 2.Buffers 3.Selectors
Java NIO的通道类的功能似流,但又有些不同:
-
既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。 通道可以异步地读写。 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
Java NIO中最重要的通道的实现包含四个
FileChannel 从文件中读写数据。 DatagramChannel 能通过UDP读写网络中的数据。 SocketChannel 能通过TCP读写网络中的数据。 ServerSocketChannel可以监听新进来的TCP连接。对每一个新进来的连接都会创建一个SocketChannel。
FileChannel 示例
import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ChannelExample { public static void main(String[] args){ try { RandomAccessFile aFile = new RandomAccessFile("D:\logs\download.info.2017-10-26.log", "rw"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf); while (bytesRead != -1){ System.out.println("Read " + bytesRead); //flip()之后,读/写指针position指到缓冲区头部,并且设置了最多只能读出之前写入的数据长度 buf.flip(); //返回剩余的可用长度 while(buf.hasRemaining()){ System.out.print((char) buf.get()); } //读入channel中的数据 buf.clear(); bytesRead = inChannel.read(buf); } aFile.close(); } catch (IOException e) { e.printStackTrace(); } } }
程序首先将文件与channel关联,随后将channel中的数据读入buffer之中,用户最后读取buffer进而得到文件中数据。