Java I/O 系统 (二)
输入输出
?
编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。
?
Java类库中的I/O类分成输入和输出两部分。通过继承,任何自Inputstream或Reader派生而来的类都含有名为read()的基本方法,用于读取单个字节或者字节数组。同样,任何自Outputstream或Writer派生而来的类都含有名为write()的基本方法,用于写单个字节或者字节数组。但是,我们通常不会用到这些方法,它们之所以存在是因为别的类可以使用它们,以便提供更有用的接口。因此,我们很少使用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能。
?
实际上,Java中,“流”类库让人迷惑的主要原因就在于:创建单一的结果流,却需要创建多个对象。
?
?
一、InputStream类型
InputStream的作用是用来表示那些从不同数据源产生输入的类,这些数据源包括:
?
- 字节数组String对象文件“管道”,工作方式与实际管道相似,即,从一段输入,从另一端输出。一个由其他种类的流组成的序列。其他数据源。
二、OutputStream类型该类别的类决定了输出所要去往的目标:字节数组,文件或管道。
?
?
?
?
InputStream部分源码分析
?
?
/** * Reads the next byte of data from this input stream. The value * byte is returned as an <code>int</code> in the range * <code>0</code> to <code>255</code>. If no byte is available * because the end of the stream has been reached, the value * <code>-1</code> is returned. * <p> * This <code>read</code> method * cannot block. * * @return the next byte of data, or <code>-1</code> if the end of the * stream has been reached. */ public synchronized int read() {return (pos < count) ? (buf[pos++] & 0xff) : -1; }?
?
继续回到InputStream类中,该类的其他两个read方法,read(byte [] b) 和 read(byte [] b , int off , int len)方法,这两个方法的实现根本上是调用了read(),而真正的read()实现又出现在其子类中,这样的做法使得读取不同类型的流时,提供了很大的灵活性,值得我们学习。