java nio与io的区别和比较

java nio与io的区别和比较

ID:13671184

大小:115.00 KB

页数:10页

时间:2018-07-23

java nio与io的区别和比较_第1页
java nio与io的区别和比较_第2页
java nio与io的区别和比较_第3页
java nio与io的区别和比较_第4页
java nio与io的区别和比较_第5页
资源描述:

《java nio与io的区别和比较》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、JavaNIO与IO的区别和比较导读J2SE1.4以上版本中发布了全新的I/O类库。本文将通过一些实例来简单介绍NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道。一.介绍NIONIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题。1.Buffer:它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的I/O操作。2.Charset:它提供Unicode字符串影射到字节序列以及逆影射的操作。3.Channels:包含socket,file和pipe三

2、种管道,它实际上是双向交流的通道。4.Selector:它将多元异步I/O操作集中到一个或多个线程中(它可以被看成是Unix中select()函数或Win32中WaitForSingleEvent()函数的面向对象版本)。二.回顾传统在介绍NIO之前,有必要了解传统的I/O操作的方式。以网络应用为例,传统方式需要监听一个ServerSocket,接受请求的连接为其提供服务(服务通常包括了处理请求并发送响应)图一是服务器的生命周期图,其中标有粗黑线条的部分表明会发生I/O阻塞。图一可以分析创建服务器的每个具体步骤。首先创建Serve

3、rSocketServerSocketserver=newServerSocket(10000);然后接受新的连接请求SocketnewConnection=server.accept();对于accept方法的调用将造成阻塞,直到ServerSocket接受到一个连接请求为止。一旦连接请求被接受,服务器可以读客户socket中的请求。InputStreamin=newConnection.getInputStream();InputStreamReaderreader=newInputStreamReader(in);Buffe

4、redReaderbuffer=newBufferedReader(reader);Requestrequest=newRequest();while(!request.isComplete()){Stringline=buffer.readLine();request.addLine(line);}这样的操作有两个问题,首先BufferedReader类的readLine()方法在其缓冲区未满时会造成线程阻塞,只有一定数据填满了缓冲区或者客户关闭了套接字,方法才会返回。其次,它回产生大量的垃圾,BufferedReader创建了

5、缓冲区来从客户套接字读入数据,但是同样创建了一些字符串存储这些数据。虽然BufferedReader内部提供了StringBuffer处理这一问题,但是所有的String很快变成了垃圾需要回收。同样的问题在发送响应代码中也存在Responseresponse=request.generateResponse();OutputStreamout=newConnection.getOutputStream();InputStreamin=response.getInputStream();intch;while(-1!=(ch=in.

6、read())){out.write(ch);}newConnection.close();类似的,读写操作被阻塞而且向流中一次写入一个字符会造成效率低下,所以应该使用缓冲区,但是一旦使用缓冲,流又会产生更多的垃圾。传统的解决方法通常在Java中处理阻塞I/O要用到线程(大量的线程)。一般是实现一个线程池用来处理请求,如图二图二线程使得服务器可以处理多个连接,但是它们也同样引发了许多问题。每个线程拥有自己的栈空间并且占用一些CPU时间,耗费很大,而且很多时间是浪费在阻塞的I/O操作上,没有有效的利用CPU。三.新I/O1.Buff

7、er传统的I/O不断的浪费对象资源(通常是String)。新I/O通过使用Buffer读写数据避免了资源浪费。Buffer对象是线性的,有序的数据集合,它根据其类别只包含唯一的数据类型。java.nio.Buffer类描述java.nio.ByteBuffer包含字节类型。可以从ReadableByteChannel中读在WritableByteChannel中写java.nio.MappedByteBuffer包含字节类型,直接在内存某一区域映射java.nio.CharBuffer包含字符类型,不能写入通道java.nio.D

8、oubleBuffer包含double类型,不能写入通道java.nio.FloatBuffer包含float类型java.nio.IntBuffer包含int类型java.nio.LongBuffer包含long类型java.nio.ShortB

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。