文本内容:
第四章简答题.前几章为什么要使用流的复合机制请根据表
1.1中的基本流,给出两个读取文件的复合流设计,给出两个存储文件的复合流设计答因为提高了读取效率读取文件复合流DDatalnputStreamin=newDatalnputStreamnewBufferedlnputStreamnewFilelnputStreamfile;
②Fileinputstreamin=newFilelnputStreamnewBufferedlnputStreamnewFilelnputStreamfile;存储文件复合流©DataOutputStreamin=newDataOutputStreamnewBufferedOutputStreamnewFileOutputStreamfile;
②FileOutputStreamin=newFileOutputStreamnewBufferedOutputStreamnewFileOutputStreamfile;.简述Java基本为与NIO的区别和联系答区别NIO优势在于一个线程管理多个通道;但是数据的处理将会变得复杂;如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,采用这种;传统的10适用于一个线程管理一个通道的情况;因为其中的流数据的读取是阻塞的;如果需要管理同时打开不太多的连接,这些连接会发送大量的数据;10是面向流的,NI0是面向缓冲区的10流是阻塞的,NI0流是不阻塞的联系NI0与原来的10有同样的作用和目的但是使用的方式完全不同,NI0支持面向缓冲区的、基于通道的10操作NI0将以更加高效的方式进行文件的读写操作.JavaNI0引入了选择器Selector的概念,请描述其工作机制并参考
4.6节写出关键性的代码答privatevoidbtnStartActionPerformedjava.awt.event.ActionEventevt{•・・〃启动服务器newThreadnewRunnable{@Overridepublicvoidrun{trywhiletrue{/轮询各通道状态,处理连接和会话intnKeys=selector.select;〃查询令牌集合ifnKeys==Ocontinue;〃没有就绪令牌,越过下面步骤,开始新一轮查询SetSelectionkeyreadyKeys=selector.selectedKeys;〃返回就绪令牌集合lteratorSelectionkeyit=readyKeys.iterator;〃就绪令牌集合选代器whileit.hasNext{〃遍历就绪令牌集合SelectionKeykey=it.next;/取出下一个令牌ifkey.isAcceptable{〃如果是连接事件doAcceptkey;〃建立连接,创建新会话通道]elseifkey.isReadable{〃如果是读数据事件doReadkey;〃接收数据it.remove;〃从就绪集合中删除处理过的令牌}//endwhile}//endwhile}catchlOExceptionex{}}//endrun}.start;}//endbtnStartActionPerformed.参考
4.7节图
4.23简述Selector的轮询机制答:
①Selector查询开始,用select方法查询令牌集合
②当集合为空时重复查询,不为空时获取就绪令牌的集合readyKeys并遍历拿八
③集合为空重新进行遍历,不为空则取下一个令牌
④处理连接,连接令牌时确认是否是数据令牌,是则读写数据,否则删除令牌
5.JavaNIO进行通道的读写转换时需要用到flip方法,为什么?请先参考
4.11节写出读写转换的关键性代码答Buffer中的flip方法涉及Buffer中定义的capacity、positionlimit三个成员变量,capacity在创建缓冲区时确定,表示缓冲区的容量;position是变化的,相当于一个当前指针,指向当前读写位置;在写模式下,limit表示最多能写入数据量的上限,在读模式下,limit表示最多能够读取的数据量,其最大值为capacity最小值为0关键代码sendBuff.clear;〃清空发送缓冲区sendBuff=ByteBuffer.wrapPaper.getBytescharset;//Paper字符串包装到缓冲区clientCharmel.writesendBuff;〃首先告诉服务器自己的选择recvBuff.clear;〃清空接收缓冲区clientchannel.readrecvBuff;〃接收来自服务器的回复recvBuff.flipO;〃指针回到数据起点StringserverSide=charset.decoderecvBuff.toString;//解码月艮务器返回字符串。