一、流的概念
IO流的主要作用是用来处理设备之间的数据传输,例如可以使用IO流将IO流一台硬盘里面的照片传输到另一台电脑上面,即将照片转换为字符节。然后将字节转到另一台电脑上面,另一台电脑接收后,可以将这些字节原照片
流从字面理解就是一个流向,通常我们说的水流,河流,都称为流,程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。来实现程序或进程间的通信,或读写外围设备、外部文件等。
流是一种抽象概念,他代表数据的无结构化传递。按照留的方式进行输入输出,数据被当成无结构的字节序或字符列。从流中取得数据的操作,而向流中添加数据的操作称为插入操作。用来进行输入输出的流就称为IO流。换句话说,IO流以流的方式进行输入输出。
二、流的分类
字节可分为两大类: 字符流和字节流。整体结构如下:

三、字节流
1、字节输出流 OutputStream类定义 public abstract class OutputStream extends Object implements Closeable, Flushable 此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到InputStream 类某个接收器要向文件中输出,使用FileOutputStream类
2、字节输入流定义: public abstract class InputStream extends Object implements Closeable 此抽象类是表示字节输入流的所有类的超类。 FileInputStream 从文件系统中的某个文件中获得输入字节。
四、字符流
1、Writer 写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。 与OutputStream一样,对文件的操作使用:FileWriter类完成。
2、Reader 用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。 使用FileReader类进行实例化操作。
五、缓冲流
对文件或其它目标频繁的读写操作,效率低,性能差。 使用缓冲流的好处是,能够更高效的读写信息,原理是将数据先缓冲起来,然后一起写入或者读取出来。
BufferedInputStream: 为另一个输入流添加一些功能,在创建 BufferedInputStream 时,会创建一个内部缓冲区数组,用于缓冲数据。
BufferedOutputStream:通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
六、打印流
打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型:
字节打印流:PrintStream
字符打印流:PrintWriter
打印流可以很方便的进行输出
七、对象流
对象流的两个类:
ObjectOutputStream将 Java 对象的基本数据类型和图形写入 OutputStream
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。这里要注意,序列化对象的时候要用到serializable接口标记为可序列化的
八、字节数组流
ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。 关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
ByteArrayOutputStream此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。 关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
九、数据流
DataInputStream: 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
十、字符串流
StringReader 其源为一个字符串的字符流。
StringWriter 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。 关闭 StringWriter 无效。此类中的方法在关闭该流后仍可被调用,而不会产生任何 IOException。

、