Channel对象的创建都是通过调用内部的open静态方法实现的,此方法是线程安全的。不论哪种类型的Channel对象,都有read(要理解为从通道中读取,写入缓冲区中)和write(要理解为从缓冲区中读取数据,写入到通道中)方法,而且read和write方法都只针对ByteBuffer对象。
当我们要获取由通道传输过来的数据时,先调用channel.read(byteBufferObj)方法,这个方法在内部调用了byteBufferObj对象的put方法,将通道中的数据写入缓冲区中。当我们要获取由通道传输来的数据时,调用byteBufferObj.flip(),然后调用byteBufferObj的get方法获取通道传过来的数据,最后调用clear或compact方法转换成写模式,为下次channel.read做准备。
当我们要向通道发送数据时,先调channel.write(byteBufferObj)方法,这个方法内部调用了byteBufferObj的get方法获取数据,然后将数据写入通道中。当写入完成后调用clear或compact方法转换成写模式,为下次channel.write写入缓冲区取做准备。
2.1 FileChannel
在文件通道中read和write方法都是阻塞的,对于read方法,除非遇到文件结束,否则会把缓冲区的剩余空间读满再返回。对于write方法,会一次性把缓冲区中的内容全部写入到文件中才会返回。
下面的代码展示了FileChannel的功能,首先向文本文件中写入utf8格式的中英文混合字符,然后再读取出来。读写过程中都涉及到编解码问题。