Java NIO
Channel
和传统的流相似,但是也存在一些差异:
- 在同一个
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()
:将数据写入并刷出。