Java NIOChannel和传统的流相似,但是也存在一些差异:
- 在同一个
Channel通道中,既可以进行 读操作 也可以进行 写操作,但是 流 只能进行 读 或者 写 其中一种操作。 Channel通道可以进行异步读写。Channel可以从Buffer中进行读写操作。将数据从Channel通道读取到Buffer缓冲区,并将数据从Buffer缓冲区写入Channel通道。
Java NIO提供了对Channel接口的实现:
FileChannel:可以对文件内容进行读写。DatagramChannel:基于UDP协议对网络数据进行读写。SocketChannel:基于TCP协议进行网络数进行读写。ServerSocketChannel:允许像web服务器一样侦听传入的TCP连接。对于每个传入连接,都会创建一个SocketChannel。
// 创建随机访问文件: RandomAccessFile randomAccessFile = new RandomAccessFile("test.txt", "rw"); // 获取FileChannel: FileChannel fileChannel = randomAccessFile.getChannel(); // 使用缓存区进行内存分配: ByteBuffer byteBuffer = ByteBuffer.allocate(1024); // 从Channel中读取数据,写入到Buffer中: int read = fileChannel.read(byteBuffer); while (-1 != read) { System.out.println("read:" + read); // flip转换读写模式: byteBuffer.flip(); while (byteBuffer.hasRemaining()) { System.out.print((char) byteBuffer.get()); } // 清除缓冲区内容: byteBuffer.clear(); read = fileChannel.read(byteBuffer); }
Channel作为数据传输的通道,提供了如下几个方法:
close():关闭Channel。closeFuture:用来处理Channel的关闭,sync()方法作为是同步等待Channel关闭;而addLinstener()方法是异步等待Channel关闭。pipline():方法田间处理器。write():方法将数据写入。flush():清空数据缓存,把数据发送到服务端。writeAndFlush():将数据写入并刷出。
