Java 的 I/O 操作类在包 java.io 下,大概有将近 80 个类,但是这些类大概可以分成四组,分别是:

    基于字节操作的 I/O 接口:InputStream 和 OutputStream

    基于字符操作的 I/O 接口:Writer 和 Reader

    基于磁盘操作的 I/O 接口:File

    基于网络操作的 I/O 接口:Socket

InputStream : ByteArrayInputStream,FileInputStream(SocketInputStream),FilterInputStream(InflaterInputStream,BufferedInputStream,DataInputStream),ObjectInputStream,PipedInputStream

OutputStream : ByteArrayOutputStream,FileOutputStream(SocketInputStream),FilterOutputStream(InflaterOutputStream,BufferedOutputStream,DataOutputStream),ObjectInputStream,PipedOutputStream

ByteArrayInputStream:

该输入流的初始化参数是个字节数组,感觉这个类就是提供了一些操纵那个字节数组的方法而已。

ByteArrayOutputStream:

内部维护一个字节数组,默认32字节,通过write方法可以把外界的数据写到这个内部的字节数组中,并提供了操纵那个字节数组的方法,可自动扩容。

FileInputStream:

初始化参数可以为文件名,文件对象,文件描述符对象,利用它可以从文件中读出1个字节,或者读出一定长度的字节,如果用read(buf),那就是读出的长度为buf的大小或小于buf的大小。

FileOutputStream:

这个是用于往文件中写数据用的,与FileInputStream正好相反。

FilterInputStream:

初始化参数为输入流对象,这就是个装饰器,一般不用它,而是用他的子类。

FilterOutputStream:

初始化参数为输出流对象,这就是个装饰器,一般不用它,而是用他的子类。

BufferedInputStream:

FilterInputStream的子类,初始化参数为输入流对象,它内部维护了一个字节数组,默认大小为8k,可配,可自动扩容,在从输入流读取内容时,先读到这个字节数组中,然后再从这个字节数组中读出内容。

BufferedOutputStream:

FilterOutputStream的子类,初始化参数为输出流对象,它内部维护了一个字节数组,默认大小为8k,可配,一般在执行flush,或要输出的数据量累计大于8k时自动flush到目的地(比如文件硬盘),有了这个缓存,大大减少了访问底层硬件的次数,提高了效率。

DataInputStream:

FilterInputStream的子类,初始化参数为输入流对象,这个类就是提供了一些操纵那个输入流的方法而已,特别注意的是readUTF这个方法,它只能读出之前用writeUTF写入的内容,因为这些内容时有格式要求的,比如前两个字节是这些内容的长度等。

DataOutputStream:

FilterInputStream的子类,初始化参数为输出流对象,这个类就是提供了一些操纵那个输出流的方法而已。

ObjectInputStream:

初始化参数为输入流对象或者为空,注意用于对象的串行化,读取ObjectOutputStream写入的对象。

ObjectOutputStream:

串行化时使用。

PipedInputStream:

内部有个字节数组,PipedOutputStream里也用这个数组,当他调用write方法时其实是调用PipedInputStream的receive方法往数组里放数据,这个数组有两个索引,一个in标识往该数组放数据的索引,一个out是标识从该数组中取数据的索引,其实就是构成了一个环形缓存,PipedInputStream和PipedOutputStream不用在同一线程使用,会死锁。

PipedOutputStream:

与PipedInputStream配合使用。

Writer 和 Reader

CharArrayWriter和CharArrayReader与ByteArrayOutputStream和ByteArrayInputStream类似,只是内部使用字符数组

BufferedWriter和BufferedReader与BufferedOutputStream和BufferedinputStream类似,只是内部使用字符数组

FileWriter继承自OutputStreamWriter,OutputStreamWriter主要是将“字符输出流”转换成“字节输出流”,他的初始化函数可以配置字符编码。FileWriter与FileOutputStream区别在于一个输入的是字符或字符串另一个是字节或字节数组。

FileReader继承自InputStreamReader,InputStreamReader主要是将“字节输入流”转换成“字符输入流”,他的初始化函数可以配置字符编码。FileReader与FileInputStream区别在于一个输出的是字符或字符串另一个是字节或字节数组。

StringReader:

初始化参数为字符串,该类就是提供了操作字符串的read方法。

StringWriter:

这里初始化了一个StringBuffer,容量默认为16,可配,不能自动扩容,write的字符或字符串会放到这个StringBuffer中。
PipedWriter和PipedReader与PipedOutputStream和PipedInputStream类似,只是内部使用字符数组

PushbackReader(与PushbackInputStream类似,只是PushbackInputStream维护的是字节数组)

初始化参数是一个reader,内部维护一个字符数组,他有unread方法,可以将字符或字符串存入那个字符数组,然后当调用read时如果字符数组中有数据就从字符数组中读出,如果没有就调用reader的read方法读出

PrintStream:

初始化参数可以为输出流或者文件对象,它提供了各种print方法,里面调用了相应的write方法,他的输入参数可以是字节或字符,这个如果输入的是字符或字符串,就会用过OutputStreamWriter将字符变为字节然后输出。

PrintWriter:

初始化参数可以为writer或outputstream或者文件对象,它提供了各种print方法,里面调用了相应的write方法,如果初始化参数outputstream,他会自动创建OutputStreamWriter,目的就是为了使字符或字符串输出到outputstream,write的输入参数只是字符或字符串。

感觉PrintStream和PrintWriter就是初始化参数和方法参数上有些不同。

Console:

这个类的构建函数是私有的,无法直接创建对象,需要调用System.console()方法,他用于从标准输入文件中读(readLine方法)出内容或往标准输出文件中写(printf方法)内容。

对应readLine,可以输入提示字段,并且输入的内容会回显。readPassword也可以输入提示字段,但输入的内容不会回显。