Java InputStream类

java.io.InputStream类是所有Java IO输入流的基类,它是以字节为单位的输出流。

定义

public abstract class InputStream  extends Object  implements Closeable

此抽象类是表示字节输入流的所有类的超类。需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。

类图

Java InputStream类图

BufferedInputStream: 提供了缓冲功能。 

DataInputStream: 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 

PipedInputStream: 允许以管道的方式来处理流。当连接到一个PipedOutputStream后,它会读取后者输出到管道的数据。 

PushbackInputStream: 允许放回已经读取的数据。 

SequenceInputStream: 能对多个inputstream进行顺序处理。

方法

InputStream.available() 返回输入流的字节数长度和大小
InputStream.read() 读取数据流字节,存储到缓冲区数组
InputStream.close() 关闭输入流并释放与该流关联的所有系统资源
InputStream.mark(int readlimit) 标记输入流中当前的位置
InputStream.markSupported() 测试此输入流是否支持mark 和reset 方法
InputStream.reset() 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置
InputStream.skip(long n) 跳过和丢弃此输入流中数据的 n 个字节

例子

public class InputStreamDemo01{
    public static void main(String args[]) throws Exception{    // 异常抛出,不处理
        // 第1步、使用File类找到一个文件
        File f= new File("d:" + File.separator + "test.txt") ;    // 声明File对象
        // 第2步、通过子类实例化父类对象
        InputStream input = null ;    // 准备好一个输入的对象
        input = new FileInputStream(f)  ;    // 通过对象多态性,进行实例化
        // 第3步、进行读操作
        byte b[] = new byte[1024] ;        // 所有的内容都读到此数组之中
        input.read(b) ;        // 读取内容   网络编程中 read 方法会阻塞
        // 第4步、关闭输出流
        input.close() ;                        // 关闭输出流
        System.out.println("内容为:" + new String(b)) ;    // 把byte数组变为字符串输出
    }
};

总结

1. 如果你正在开发一个从流中读取数据的组件,请尝试用InputStream替代任何它的子类(比如FileInputStream)进行开发。这么做能够让你的代码兼容任何类型而非某种确定类型的输入流。

2. Java中的Inputstream是不能重复读取的,它的读取是单向的,因为读取的时候,会有一个pos指针,他指示每次读取之后下一次要读取的起始位置,当读到最后一个字符的时候,pos指针不会重置。

3. 如果想要重复使用InputStream对象,可以先把InputStream转化成ByteArrayOutputStream,后面要使用InputStream对象时,再从ByteArrayOutputStream转化回来就好了。