预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Java深度历险(八)——JavaI/O 在应用程序中,通常会涉及到两种类型的计算:CPU计算和I/O计算。对于大多数应用来说,花费在等待I/O上的时间是占较大比重的。通常需要等待速度较慢的磁盘或是网络连接完成I/O请求,才能继续后面的CPU计算任务。因此提高I/O操作的效率对应用的性能有较大的帮助。本文将介绍Java语言中与I/O操作相关的内容,包括基本的JavaI/O和JavaNIO,着重于基本概念和最佳实践。 流 Java语言提供了多个层次不同的概念来对I/O操作进行抽象。JavaI/O中最早的概念是流,包括输入流和输出流,早在JDK1.0中就存在了。简单的来说,流是一个连续的字节的序列。输入流是用来读取这个序列,而输出流则构建这个序列。HYPERLINK"http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html"InputStream和HYPERLINK"http://download.oracle.com/javase/6/docs/api/java/io/OutputStream.html"OutputStream所操纵的基本单元就是字节。每次读取和写入单个字节或是字节数组。如果从字节的层次来处理数据类型的话,操作会非常繁琐。可以用更易使用的流实现来包装基本的字节流。如果想读取或输出Java的基本数据类型,可以使用HYPERLINK"http://download.oracle.com/javase/6/docs/api/java/io/DataInputStream.html"DataInputStream和HYPERLINK"http://download.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html"DataOutputStream。它们所提供的类似readFloat和writeDouble这样的方法,会让处理基本数据类型变得很简单。如果希望读取或写入的是Java中的对象的话,可以使用HYPERLINK"http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html"ObjectInputStream和HYPERLINK"http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html"ObjectOutputStream。它们与对象的HYPERLINK"http://download.oracle.com/javase/6/docs/technotes/guides/serialization/index.html"序列化机制一起,可以实现Java对象状态的持久化和数据传递。基本流所提供的对于输入和输出的控制比较弱。InputStream只提供了顺序读取、跳过部分字节和标记/重置的支持,而OutputStream则只能顺序输出。 流的使用 由于I/O操作所对应的实体在系统中都是有限的资源,需要妥善的进行管理。每个打开的流都需要被正确的关闭以释放资源。所遵循的原则是谁打开谁释放。如果一个流只在某个方法体内使用,则通过finally语句或是JDK7中的HYPERLINK"http://download.java.net/jdk7/docs/technotes/guides/language/try-with-resources.html"try-with-resources语句来确保在方法返回之前,流被正确的关闭。如果一个方法只是作为流的使用者,就不需要考虑流的关闭问题。典型的情况是在servlet实现中并不需要关闭HttpServletResponse中的输出流。如果你的代码需要负责打开一个流,并且需要在不同的对象之间进行传递的话,可以考虑使用HYPERLINK"http://c2.com/cgi/wiki?ExecuteAroundMethod"ExecuteAroundMethod模式。如下面的代码所示: publicvoiduse(StreamUseruser){InputStreaminput=null;try{input=open();user.use(input);}catch(IOExceptione){user.onError(e);}finally{if(input!=null){try{input.close();}catch(IOExceptione){user.onError(e);}}}} 如上述代码中所