文档详情

java输入输出-(数据库技术-安全技术-).ppt

发布:2017-05-06约6.92万字共431页下载文档
文本预览下载声明
2. 源程序 //程序文件名为UseFchannel.java import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; class UseFchannel { public static void main(String[] args) { try { String filename = f.txt; FileInputStream input = new FileInputStream(filename); FileChannel channel = input.getChannel(); int fileLength = (int)channel.size(); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, fileLength); Charset charset = Charset.forName(ISO-8859-1);// CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(buffer); System.out.println(charBuffer); } catch(Exception e) { System.out.println(Error: + e.getMessage()); } } } 3. 结果分析 图12.5上一部分显示打开的文件内容,下一部分显示程序输出的内容,可以看出两者是一致的。 图12.5 源文件内容与程序输出的内容对比 12.6.4 Selectors 非阻塞I/O围绕为多元选择通道准备的Selectors(选择器)对象构建。选择器对象保持一系列选择键,这些键在应用中可由某个事件激活。选择器本身管理键,编程人员使用键的状态管理回调来完成客户请求。 构造函数如下: protected Selector() 初始化一个实例。 选择器可以通过调用自带的open方法进行创建: Selector s = Selector.open(); 下面的两个方法用来返回选择键值的个数和键值集合。 public abstract int select() throws IOException 返回键值的个数。 public abstract Set selectedKeys() 返回选择器选中的键值集合。 对于一个Socket通道,只有将它本身发生的事件(如监听、连接、读、写等)在选择器上进行注册,才可以被选择器识别,从而进行处理,这个注册就用到SelectionKey类。SelectionKey类包括四个注册值,将通道支持的事件注册到相应的选择器上。它还提供四个判断键值状态的方法,从而进行相应的事件处理,如表12.3所示。 表12.3 SelectionKey类的注册值及其方法 例如,接收新连接的通道应该注册为: ServerSocketChannel ch = ServerSocketChannel.open(); SelectionKey acceptKey = ch.register(s,SelectionKey.OP_ACCEPT); 一个读取和写入数据的通道应该注册为: SelectionKey readWriteKey = ch.register(s,SelectionKey.OP_READ|SelectionKey.OP_WRITE); 当用户发送一个请求时,选择器通过返回键进行工作。 //循环实现 While((keysAdded = s.select())0) { //返回键值集合 set readyKeys = s.selectedKeys(); //使用Iterator枚举 Iterator I = readKeys.iterator(); While(i.hasNext()) { SelectionKey sk = (SelectionKey)i.next(); ...接收连接处理请求; } } 具体的处理可以根据键值的状态进行,上面的“接收连接处理请求”就可以为: i.remove(); if ( key.isAcceptable() ) { ... } else if ( key.isWritable() ) {
显示全部
相似文档