Channel阅读笔记
文章目录
- Channel阅读笔记
- 镇楼:Channel接口的层次结构
- 镇楼:Channel接口解析
- 镇楼:NIO核心接口的实现类
镇楼:Channel接口的层次结构
- 可点击上图放大
- 在NIO技术中,通道是核心要点。要讲操作的数据打包到缓冲区中,而缓冲区的数据想要传输到目的地是要依赖于通道的。缓冲区是将数据进行打包,而通道是讲数据进行传输,可见两者是形影不离的。他们也是NIO技术中比较重要的知识点。
镇楼:Channel接口解析
-
AutoCloseable接口的作用是可以自动该关闭,不需要显示的调用close方法,例如try-with-resource
// 可以支持1.7的新特性try-with-resources,在抛异常或finally之前会执行此重写函数 public class ChannelTest implements AutoCloseable { public static void main(String[] args) { try (ChannelTest channelTest = new ChannelTest()) { System.out.println("todo"); throw new Exception(); } catch (Exception e) { System.out.println("catch"); e.printStackTrace(); }finally { System.out.println("finally"); } } @Override public void close() throws Exception { System.out.println("自动关闭"); } } /* todo 自动关闭 catch java.lang.Exception at com.kylin.socket.ChannelTest.main(ChannelTest.java:14) finally */
-
Closeable接口的作用是关闭I/O流,释放系统资源,所以抛出IO异常。并且该方法是幂等的,重复调用也不会出现任何的效果和影响。因为继承了AutoCloseable,所以本身的close也是具有自动关闭的功能
-
Channel自身接口有一个抽象方法isOpen方法测试通道是否处于打开状态,避免出现ClosedChannelException异常
PS:注意以下只是说rt.java包下的
一、AsynchronousChannel接口
主要作用是使通道支持异步I/O操作.
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
AsynchronousFileChannel, AsynchronousServerSocketChannel, AsynchronousSocketChannel
-
2、查看类图关系
-
3、抽象方法
void close() throws IOException;
二、AsynchronousByteChannel接口
主要作用是使通道支持异步I/O操作,操作单位为字节
read和write方法在上一个未完成的时候再次调用会抛出异常,其他I/O操作是否可以同时进行read操作,取决于通道的类型或实现,ByteBuffer类不是线程安全的
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
-
2、查看类图关系
3、抽象方法
-
<A> void read(ByteBuffer dst,A attachment,CompletionHandler<Integer,? super A> handler);
-
Future<Integer> read(ByteBuffer dst);
读数据到dst,采用future接受结果 -
<A> void write(ByteBuffer src,A attachment,CompletionHandler<Integer,? super A> handler);
-
Future<Integer> write(ByteBuffer src);
三、ReadableByteChannel接口
主要作用是使通道允许对字节进行读操作,
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SourceChannel, SocketChannel
-
2、查看类图关系
3、抽象方法
public int read(ByteBuffer dst) throws IOException;
- 从通道中读取数据到dst缓存区,只允许有1个读操作在进行,如果1个线程正在1个通道上执行1个read()操作,那么任何试图发起另一个read()操作的线程都会被阻塞,直到第一个read()操作完成。其它类型的I/O操作是否可以与read()操作同时进行,取决于通道的类型。所以它是同步的。
四、ScatteringByteChannel接口
主要作用是可以从通道中读取字节到多个缓冲区
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SourceChannel, SocketChannel
-
2、查看类图关系
3、抽象方法
public long read(ByteBuffer[] dsts, int offset, int length)throws IOException;
public long read(ByteBuffer[] dsts) throws IOException;
五、WritableByteChannel接口
主要作用是使通道允许对字节进行写操作
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SinkChannel, SocketChannel
-
2、查看类图关系
3、抽象方法
public int write(ByteBuffer src) throws IOException;
- 将1个字节缓存区的字节序列写入通道的当前位置;
- 方法是同步的
六、GatheringByteChannel接口
主要作用是可以将多个缓冲区中的数据写入到通道中
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SinkChannel, SocketChannel
-
2、查看类图关系
3、抽象方法
七、ByteChannel接口
主要作用是讲ReadableByteChannel(可读字节通道)和WritableByteChannel(可写字节通道)的规范进行统一,也就是ByteChannel接口的父接口就是ReadableByteChannel和WritableByteChannel。
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
AutoCloseable, Channel, Closeable, ReadableByteChannel, WritableByteChannel
-
All Known Subinterfaces:
-
All Known Implementing Classes:
-
2、查看类图关系
3、抽象方法
- 无,直接具有父类的read和write方法
八、SeekableByteChannel接口
主要作用是在字节通道中维护position(位置),以及允许position发生改变
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
AutoCloseable, ByteChannel, Channel, Closeable, ReadableByteChannel, WritableByteChannel
-
All Known Implementing Classes:
-
2、查看类图关系
3、抽象方法
int read(ByteBuffer dst) throws IOException;
继承父类int write(ByteBuffer src) throws IOException;
继承父类long position() throws IOException;
返回此通道的position位置SeekableByteChannel position(long newPosition) throws IOException;
- 设置此通道的position位置
long size() throws IOException;
- 返回连接到此通道的实体大小
SeekableByteChannel truncate(long size) throws IOException;
- 截断文件,size为截断的字节数量,截断之后size之后的数据都丢失
- 例如:
raf.getChannel().truncate(file.length()-4);
九、NetworkChannal接口
使通道与Socket进行关联,使通道中的数据能在Socket技术上进行传输
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
AsynchronousServerSocketChannel, AsynchronousSocketChannel, DatagramChannel, ServerSocketChannel, SocketChannel
-
2、查看类图关系
3、抽象方法
NetworkChannel bind(SocketAddress local) throws IOException;
- 将Socket绑定到本地地址
SocketAddress getLocalAddress() throws IOException;
- 返回绑定到此Socket中的SocketAddress地址
<T> NetworkChannel setOption(SocketOption<T> name, T value) throws IOException;
- 设置套接字选项集
<T> T getOption(SocketOption<T> name) throws IOException;
- 返回套接字选项的值
Set<SocketOption<?>> supportedOptions();
- 返回此通道支持的套接字选项集
十、MulticastChannal接口
主要作用是使通道支持Internet Protocol(IP)多播
IP多播:就是将多个主机地址进行打包,形成一个组(group),然后将IP报文向这个组进行发送,也就相当于同时向多个主机传输数据
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
-
2、查看类图关系
3、抽象方法
@Override void close() throws IOException;
就是继承父接口的MembershipKey join(InetAddress group, NetworkInterface interf)throws IOException;
- 加入多播组,开始接受从给定源地址发送到组的数据报,返回组成员密钥
- group 多播地址
- interf 要加入组的网络接口
- MembershipKey 一个表示互联网协议(IP)多播组成员的令牌
MembershipKey join(InetAddress group, NetworkInterface interf, InetAddress source)throws IOException;
- 加入多播组,开始接受从给定源地址发送到组的数据报,返回组成员密钥
- group 多播地址
- interf 要加入组的网络接口
- source 源地址
- MembershipKey 一个表示互联网协议(IP)多播组成员的令牌
十一、InterruptibleChannel接口
主要作用是使通道能以异步的方式进行关闭和中断
1、查看jdkdoc文档
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, SocketChannel
-
2、查看类图关系
-
图中看不全的名称后面都是channel
-
3、抽象方法
public void close() throws IOException;
镇楼:NIO核心接口的实现类
1、AbstractInterruptibleChannel
2、AbstractSelectableChannel
3、AsynchronousFileChannel
4、AsynchronousServerSocketChannel
5、AsynchronousSocketChannel
6、DatagramChannel
7、FileChannel
8、Pipe.SinkChannel
9、Pipe.SourceChannel
10、SelectableChannel
11、ServerSocketChannel
12、SocketChannel
有兴趣的可以去都看一下,后面个人主要是对FileChannel写一个阅读笔记