流的基本概念
流按照方向不同,可分为:输入流(读取流),输出流(写入流)
流的方向以内存作为参照物,当从数据源中将数据读取到内存中时,称为输入流,也叫读取流
当从内存中将数据写入到数据源时,成为输出流,也叫写入流
按照传输内容分为:
字节流(传输二进制字节数据)
字符流(传输字符数据)
对象流(传输对象数据)
无论传输的是什么数据,在底层都是以字节方式传输。所以真正的流只有一种,那就是字节流。
为了方便开发者更好的对字符数据的对象数据进行操作,javaAPI对字节流进行了一层封装,形成了字符流和对象流

字节流有两个抽象父类:InputStream和OutputStream
字符流有两个抽象父类:Reader和Writer

流的子类
不同的数据源读写数据的方式会有所不同,所以在字节流和字符流的父类中,预留了读写数据的抽象方法,不同的子类根据自己数据源的特点分别去实现
BufferedIputStream(数据源是缓冲区)
FileInputStream(数据源是文件)
ObjectInputStream(数据源是对象)

流操作的步骤:
1、创建流
2、操作流
3、关闭流

操作文件流时,如果文件不存在,对于读取流会抛出文件未找到的异常,对于写入流会创建新文件,前提是目录必须存在

流操作完毕后,需要完成流的关闭。否则,不仅浪费内存资源,写入流还有可能写不进数据。

流操作的本质时完成内存数据和数据源数据的转换。

写入流将数据写入数据源时,需要通过flush()刷新语句,才能将数据真正写入数据源。在流关闭时,会自动执行flush()刷新语句。所以,写入流在不关闭,也不刷新的情况下, 有可能写不进数据