`
mmbow
  • 浏览: 13792 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 输入流和输出流概述

 
阅读更多

java 输入流和输出流概述
2010年12月07日
  程序的主要任务是操纵数据。在运行时,这些数据都必须位于内存中,并且属于特定的类型,程序才能操纵它们。在java中,把一组有序的数据序列称为流。根据操作的类型,可以把流分为输入流和输出流2种。程序从输入流读取数据,向输出流写出数据。见下图 
  
  Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象。如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元是字符,那么称这种流为字符流。在I/O类库中, java.io.InputStream 和 java.io.OutputStream 分别表示字节输入流和字节输出流,java.io.Reader 和 java.io.Writer分别表示字符输入流和字符输出流。我们有的时候把InputStream 和 OutputStream 直接称为输入流和输出流,而对于 Reader 和 Writer,则直接使用它们的英文类名。 
  从JDK1.4版本开始引入了新I/O类库,它位于java.nio包中,新I/O类库利用通道和缓冲区等来提高I/O操作的效率。
  在java.io包中, java.io.InputStream 表示字节输入流, java.io.OutputStream表示字节输出流,它们都是抽象类,不能被实例化。InputStream 类提供了一系列和读取数据有关的方法。 
  (1) int read() : 从输入流读取数据,有如下3中重载形式。 
  int read() :从输入流读取一个8位的字节,把它转换为 0~255之间的整数,并返回这一整数。例如,如果读到9, 则返回9, 如果读到的字节为-9,则返回 247,。如果遇到输入流的结尾则返回-1. 
  int read(byte[] b):从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。返回的整数表示读取的字节数。如果遇到输入流结尾,则返回-1. 
  int read(byte[] b, int off, int len):从输入流读取若干个字节,把它们保存到参数b指定的直接数组中。参数off指定在字节数组中开始保存数据的起始下标,参数len指定读取的字节数目。返回的整数表示实际读取的字节数。如果遇到输入流的结尾,则返回-1。 
  以上第一个read方法从输入流读取一个字节,而其余两个read方法从输入流批量读取若干字节。在从文件或键盘读数据时,采用后面两个read可以减少进行物理读文件或键盘的次数,因此提高I/O操作的效率。 
  (2) void close() : 关闭输入流。当完成所有的读操作后,应该关闭输入流。InputStream 类本身的close()方法不执行任何的操作。它的一些子类覆盖了close()方法,在close()方法中释放和流有关的系统资源。 
  (3) int available():返回可以从输入流中读取的字节数目。 
  (4) skip(long n): 从输入流中跳过参数n指定的直接数目。 
  (5) boolean markSupported(), void mark(int readLimit),void reset(): 如果要从流中重复读入数据,可以通过以下方式实现。先用markSupported()方法判断这个流是否支持重复读取数据,如果返回true,则表明可以在流上设置标记。接下来调用 mark(int readLimit)方法从流的当前位置开始设置标记, readLimit 参数指定在流上做了标记的字节数。然后用read()方法读取在标记范围内的字节。最后调用reset()方法,该方法使输入流重新定位到刚才做了标记的起始位置。这样就可以重复读取做过标记的数据了。 
  java.io.Stream 类提供了一系列与写数据有关的方法。 
  (1) void write(int b) :像输出流写入数据,有如下3中重载形式。 
  void write(b) : 向输出流写入一个字节。 
  void write(byte[] b): 把参数b指定的字节数组中的所有字节写到输出流。 
  void write(byte[] int off, int len):把参数b指定的字节数组中的若干字节写到输出流中,参数off指定直接数组的起始下标,从这个位置开始输出由参数len指定数目的字节。 
  以上第一个write方法 向输出流写入一个字节,而其余两个Write方法向输出流批量写入若干字节。在向文件或控制台写数据时,采用后面两个write 方法可以减少进行物理写文件或控制台的次数,因此可以提高I/O操作的效率。 
  (2) void close();:关闭输入流。当完成所有的写操作后,应该关闭输入流。OutputStream类本身的close()方法 不执行任何操作。它的一些子类覆盖了close()方法,释放和流有关的系统资源。 
  (3) void flush():OutputStream 类本身 的flush()方法不执行任何操作,它的一些带有缓冲区的子类(比如BufferOutStream 和 PrintStream类)覆盖了 flush()方法。通过带有缓冲区的输出流写数据时,数据线保存在缓冲区,积累到一定程序才会真正写到输出流中。缓冲区通常用字节数组实现,实际上是指一块内存空间。flush()方法强制把缓冲区的数据写到输出流中。 
  可以把程序向输出流写数据比作从北京运送烤鸭到上海。如果没有缓冲区,那么没执行一次write(int b)方法,仅仅把一只烤鸭从北京运到上海,如果有一万只烤鸭,就必须运送一万次,这样的运送效率显然很低。为了减少运送次数,可以先把一批烤鸭装在卡车的车厢中,这样就能成批地运送烤鸭,卡车的车厢就是缓冲区。在默认情况下,只有当车厢装满烤鸭后,才会把这批烤鸭运送到上海,而flush()方法表示不管车厢是否装满,都立即执行一次运货操作。 
  为了保证输入流或输出流被及时关闭,最好把关闭流的操作放在finally 代码块中。I/O操作通常采用以下程序流程:  InputStream in; OutputStream out; try{ //处理输入流 //处理输出流 }catch(IOException e){ //处理IO异常 }finally{ in.close(); out.close(); } InputStream in; OutputStream out; try{ //处理输入流 //处理输出流 }catch(IOException e){ //处理IO异常 }finally{ in.close(); out.close(); } 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics