网站大量收购闲置独家精品文档,联系QQ:2885784924

单元学习JavaNIO知识.pdf

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
I/O 流或者输入 /输出流指的是计算机与外部世界或者一个程序与计算机的其余部分的之间 的接口。 1 传统 IO 以网络应用为例,传统方式需要监听一个 ServerSocket ,接受请求的连接为其提供服务(服 务通常包括了处理请求并发送响应) 图一是服务器的生命周期图, 其中标有粗黑线条的部分 表明会发生 I/O 阻塞。 图一 1.1 创建服务器的每个具体步骤 (1) 首先创建 ServerSocket ServerSocket server=new ServerSocket (10000 ); (2 )然后接受新的连接请求 Socket newConnection=server.accept (); 对于 accept 方法的调用将造成阻塞, 直到 ServerSocket 接受到一个连接请求为止。 一旦 连接请求被接受,服务器可以读客户 socket 中的请求。 InputStream in = newConnection.getInputStream(); InputStreamReader reader = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(reader); Request request = new Request(); while(!request.isComplete()) { String line = buffer.readLine(); request.addLine(line); } 1.2 这样的操作有两个问题 (1) 首先 BufferedReader 类的 readLine ()方法在其缓冲区未满时会造成线程阻塞,只 有一定数据填满了缓冲区或者客户关闭了套接字,方法才会返回。 (2 ) 其次,它会产生大量的垃圾, BufferedReader 创建了缓冲区来从客户套接字读入数 据,但是同样创建了一些字符串存储这些数据。虽然 BufferedReader 内部提供了 StringBuffer 处理这一问题,但是所有的 String 很快变成了垃圾需要回收。同样的问 题在发送响应代码中也存在。 Response response = request.generateResponse(); OutputStream out = newConnection.getOutputStream(); InputStream in = response.getInputStream() ; int ch ; while(-1 != (ch = in.read())) { out.write(ch); } newConnection.close(); 类似的,读写操作被阻塞而且向流中一次写入一个字符会造成效率低下,所以应该 使用缓冲区,但是一旦使用缓冲,流又会产生更多的垃圾。 1.3 传统的解决方法 通常在 Java 中处理阻塞 I/O 要用到线程(大量的线程)。一般是实现一个线程池用来处理 请求,如图二 图二 线程使得服务器可以处理多个连接, 但是它们也同样引发了许多问题。 每个线程拥有自己的 栈空间并且占用一些 CPU 时间,耗费很大,而且很多时间是浪费在阻塞的 I/O 操作上,没 有有效的利用 CPU。 2 新 I/O 新的输入 / 输出 (NIO) 库是在 JDK 1.4

文档评论(0)

niujiaoba + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档