Java中IO流分成两大类,一种是输入流。全部的输入流都直接或间接继承自InputStream抽象类,输入流作为数据的来源。我们能够通过输入流的read方法读取字节数据。还有一种是输出流,全部的输出流都直接或间接继承自OutputStream抽象类,输出流接收数据。能够通过write方法写入字节数据。在Java的IO流类中,大部分的输入流和输出流都是成对存在的。即假设存在XXXInputStream。那么就存在XXXOutputStream。反之亦然。(SequenceInputStream和StringBufferInputStream是特例,没有相应的SequenceOutputStream类和StringBufferOutputStream类,稍后会解释)。很多IO操作都可能会抛出IOException异常,比方read、write、close操作。
下面是Java的IO流中常见的输入流,由于每一个输入流都有其相应的输出流,所以此处就不再列出输出流的继承结构图。
下面依次对这些类进行介绍以及怎样使用。
ByteArrayInputStream & ByteArrayOutputStream
ByteArrayInputStream构造函数中须要传入一个byte数组作为数据源,当运行read操作时,就会从该数组中读取数据,正如其名,是一种基于字节数组实现的一种简单输入流,显而易见的是,假设在构造函数中传入了null作为字节数据。那么在运行read操作时就会出现NullPointerException异常。可是在构造函数初始化阶段不会抛出异常。与之相相应的是ByteArrayOutputStream,其内部也有一个字节数组用于存储write操作时写入的数据,在构造函数中能够传入一个size指定其内部的byte数组的大小。假设不指定,那么默认它会将byte数组初始化为32字节,当持续通过write向ByteArrayOutputStream中写入数据时,假设其内部的byte数组的剩余空间不能够存储须要写入的数据,那么那么它会通过调用内部的ensureCapacity
方法对其内部维护的byte数组进行扩容以存储全部要写入的数据,所以不必操心其内部的byte数组太小导致的IndexOutOfBoundsException之类的异常。
下面是ByteArrayInputStream 和 ByteArrayOutputStream的代码片段演示样例:
在上面的样例中,我们通过字符串获取字节数组将其作为ByteArrayInputStream的数据流来源,然后通过读取ByteArrayInputStream的数据,将读到的数据写入到ByteArrayOutputStream中。
FileInputStream & FileOutputStream
FileInputStream 能够将文件作为数据源,读取文件里的流,通过File对象或文件路径等初始化。在其构造函数中。假设传入的File对象(或与其相相应的文件路径所表示的File对象)不存在或是一个文件夹而不是文件或者由于其它原因无法打开读取数据,都会导致在初始化阶段导致抛出FileNotFoundException异常。与FileInputStream 相相应的是FileOutputStream,能够通过FileOutputStream向文件里写入数据,也须要通过File对象或文件路径对其初始化,如同FileInputStream ,假设传入的File对象(或与其相相应的文件路径所表示的File对象)是一个文件夹而不是文件或者由于其它原因无法创建该文件写入数据,都会导致在初始化阶段抛出FileNotFoundException异常。
下面是FileInputStream 和 FileOutputStream的代码演示样例片段: