3、通道
Channle主要分为两类:File操作对应的FIleChannel和Stream操作对应的socket的3个channe。
1、这3个channel都是抽象类。其具体实现在SPI里面。
2、这3个channel都是双向的,都实现了ByteChannel。
3、网络Channel可工作在非阻塞模式下,是可配置的FileChannel在NIO里面只能工作在阻塞模式下。
4、4个Channel的操作都是可中断的。可中断的语义如下
问题:stream操作除了socket还有其他的吧?例如串口等
为什么FIleChannel不能工作在非阻塞模式下?
3.1.1打开通道
通道可以以多种方式创建。Socket 通道有可以直接创建新socket 通道的工厂方法。但是一个FileChannel 对象却只能通过在一个打开的RandomAccessFile、FileInputStream 或 FileOutputStream对象上调用getChannel( )方法来获取。您不能直接创建一个FileChannel 对象。File 和socket 通道会
SocketChannel sc = SocketChannel.open( );
sc.connect (new InetSocketAddress ("somehost", someport));
ServerSocketChannel ssc = ServerSocketChannel.open( );
ssc.socket( ).bind (new InetSocketAddress (somelocalport));
DatagramChannel dc = DatagramChannel.open( );
RandomAccessFile raf = new RandomAccessFile ("somefile", "r");
FileChannel fc = raf.getChannel( );
Reader和Writer不能用来产生Channel
3.1.2使用通道
1、Channel是针对于Byte操作的
2、ReadonluByteChannel和WritableByteChannel是单双工的,ByteChannle是全双工的。
3、每一个file和socket的channle都实现了ByteChannel,按理来说都应该是全双工的,socket的channel确实是全双工的,但是FileChannel则不一定。因为文件channel是和文件相关的,会受到文件的打开方式和文件的权限。
我们知道,一个文件可以在不同的时候以不同的权限打开。从FileInputStream 对象的getChannel( )方法获取的FileChannel 对象是只读的,不过从接口声明的角度来看却是双 向的,因为FileChannel 实现ByteChannel 接口。在这样一个通道上调用write( )方法将抛出未经检查的NonWritableChannelException 异常,因为FileInputStream 对象 总是以read-only 的权限打开文件。
4、通道可以以阻塞(blocking)或非阻塞(nonblocking)模式运行。非阻塞模式的通道