java深度历险(八)——java io

java深度历险(八)——java io

ID:6031897

大小:30.07 KB

页数:6页

时间:2017-12-31

java深度历险(八)——java io_第1页
java深度历险(八)——java io_第2页
java深度历险(八)——java io_第3页
java深度历险(八)——java io_第4页
java深度历险(八)——java io_第5页
资源描述:

《java深度历险(八)——java io》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Java深度历险(八)——JavaI/O在应用程序中,通常会涉及到两种类型的计算:CPU计算和I/O计算。对于大多数应用来说,花费在等待I/O上的时间是占较大比重的。通常需要等待速度较慢的磁盘或是网络连接完成I/O请求,才能继续后面的CPU计算任务。因此提高I/O操作的效率对应用的性能有较大的帮助。本文将介绍Java语言中与I/O操作相关的内容,包括基本的JavaI/O和JavaNIO,着重于基本概念和最佳实践。流Java语言提供了多个层次不同的概念来对I/O操作进行抽象。JavaI/O中最早的概念是流,包括输入流和输出

2、流,早在JDK1.0中就存在了。简单的来说,流是一个连续的字节的序列。输入流是用来读取这个序列,而输出流则构建这个序列。InputStream和OutputStream所操纵的基本单元就是字节。每次读取和写入单个字节或是字节数组。如果从字节的层次来处理数据类型的话,操作会非常繁琐。可以用更易使用的流实现来包装基本的字节流。如果想读取或输出Java的基本数据类型,可以使用DataInputStream和DataOutputStream。它们所提供的类似readFloat和writeDouble这样的方法,会让处理基本数据类

3、型变得很简单。如果希望读取或写入的是Java中的对象的话,可以使用ObjectInputStream和ObjectOutputStream。它们与对象的序列化机制一起,可以实现Java对象状态的持久化和数据传递。基本流所提供的对于输入和输出的控制比较弱。InputStream只提供了顺序读取、跳过部分字节和标记/重置的支持,而OutputStream则只能顺序输出。流的使用由于I/O操作所对应的实体在系统中都是有限的资源,需要妥善的进行管理。每个打开的流都需要被正确的关闭以释放资源。所遵循的原则是谁打开谁释放。如果一个流

4、只在某个方法体内使用,则通过finally语句或是JDK7中的try-with-resources语句来确保在方法返回之前,流被正确的关闭。如果一个方法只是作为流的使用者,就不需要考虑流的关闭问题。典型的情况是在servlet实现中并不需要关闭HttpServletResponse中的输出流。如果你的代码需要负责打开一个流,并且需要在不同的对象之间进行传递的话,可以考虑使用ExecuteAroundMethod模式。如下面的代码所示:publicvoiduse(StreamUseruser){InputStreaminp

5、ut=null;try{input=open();user.use(input);}catch(IOExceptione){user.onError(e);}finally{if(input!=null){try{input.close();}catch(IOExceptione){user.onError(e);}}}}如上述代码中所看到的一样,由专门的类负责流的打开和关闭。流的使用者StreamUser并不需要关心资源释放的细节,只需要对流进行操作即可。在使用输入流的过程中,经常会遇到需要复用一个输入流的情况,即多次

6、读取一个输入流中的内容。比如通过URL.openConnection方法打开了一个远端站点连接的输入流,希望对其中的内容进行多次处理。这就需要把一个InputStream对象在多个对象中传递。为了保证每个使用流的对象都能获取到正确的内容,需要对流进行一定的处理。通常有两种解决的办法,一种是利用InputStream的标记支持。如果一个流支持标记的话(通过markSupported方法判断),就可以在流开始的地方通过mark方法添加一个标记,当完成一次对流的使用之后,通过reset方法就可以把流的读取位置重置到上次标记的位

7、置,即流开始的地方。如此反复,就可以复用这个输入流。大部分输入流的实现是不支持标记的。可以通过BufferedInputStream进行包装来支持标记。privateInputStreamprepareStream(InputStreamins){BufferedInputStreambuffered=newBufferedInputStream(ins);buffered.mark(Integer.MAX_VALUE);returnbuffered;}privatevoidresetStream(InputStream

8、ins)throwsIOException{ins.reset();ins.mark(Integer.MAX_VALUE);}如上面的代码所示,通过prepareStream方法可以用一个BufferedInputStream来包装基本的InputStream。通过mark方法在流开始的时候添加一个标记,允许读入In

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

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

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