Java流

文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符
序列称为字符流。Java 中根据流的方向可以分为输入流和输出流。输入流是将文件或其它输入
设备的数据加载到内存的过程;输出流恰恰相反,是将内存中的数据保存到文件或其他输出设
备。即输入到内存的为输入流,从内存输出的输出流。
image.png
输入输出流分为字节流和字符流
IO流 - 图2

InputStream(字节输入流)

InputStream 是字节输入流,InputStream 是一个抽象类,所有继承了 InputStream 的类都是 字节输入流,
image.png
主要方法
image.png
image.png

OutputStream(字节输出流)

所有继承了 OutputStream 都是字节输出流
image.png
主要方法
image.png
image.png

Reader(字符输入流)

所有继承了 Reader 都是字符输入流
image.png
主要方法
image.png

Writer(字符输出流)

所有继承了 Writer 都是字符输出流
image.png
主要方法
image.png
image.png

文件流

FileInputStream(文件字节输入流)

FileInputStream主要按照字节方式读取文件
这样读取文件获取的结果可能是乱码,因为该流是按一个字节一个字节读取的,而汉字是两个字节,所以读书打印出来的结果是乱码的。

FileOutputStream(文件字节输出流)

FileOutputStream 主要按照字节方式写文件。例如做文件的复制。

FileReader(文件字符输入流)

FileReader 是一字符为单位读取文件,也就是一次读取两个字节,而一个汉字刚好两个字节,所以用文件字符流读取文件不会是中文乱码。

FileWriter(文件字符输出流)

FileWriter主要按照一个字符,即两个字节来写文件。

缓冲流

缓冲流主要是为了提高效率而存在的,减少物理读取次数,缓冲流主要有:BufferedInputStream、
BufferedOutputStream、BufferedReader、BufferedWriter,并且 BufferedReader 提供了实用方法
readLine(),可以直接读取一行,BufferWriter 提供了 newLine()可以写换行符。

转换流

InputStreamReader

InputStreamReader 主要是将字节流输入流转换成字符输入流

OutputStreamWriter

OutputStreamWriter 主要是将字节流输出流转换成字符输出流

打印流

打印流主要包含两个:PrintStream 和 PrintWriter,分别对应字节流和字符流

PrintStream

System.out 其实out是PrintSteam类的对象,或者说属性,不是System类的,只是由System类来调用,而PrintSteam类中有println()方法
所以System.out.println,是PrintSteam类的out对象调用了println()方法———System.out 其实对应的就是 PrintStream,默认输出到控制台,我们可以通过setOut(PrintSteam out);方法来我们可以重定向它的输出,可以定向到文件,
System类中有个方法:setOut(PrintSteam out); 重定向输出方法
PrintSteam类:PrintSteam(OutputSteam out); 打印流,里面传的对象是输出流对象。

对象流

对象流可以将 Java 对象转换成二进制写入磁盘,这个过程通常叫做序列化(输出流),并且还可以从
磁盘读出完整的 Java 对象,而这个过程叫做反序列化(输入流)。

序列化 ObjectOutputStream

如果实现序列化该类必须实现序列化接口 java.io.Serializable,该接口没有任何方法,该接口只是一种标记接口,标记这个类是可以序列化的
要序列化的类实现接口Serializable,序列化对象调用 .writeObject(对象);方法来实现写出

transient 关键字

对于要序列化的类,如果其中的某个属性采用了transient关键字修饰的话,序列化时就会忽略它。

序列化号/类版本号 serialVersionUID 属性

进行序列化存储时,会为类生成一个序列化号,生成之后,一旦后期再修改该序列化类,就会重新生成新的序列化号,这样会导致系统认为是两个不同的类,从而出现编译运行有误,所以最好是在一开始的时候自己加入一个固定的序列化号:static final long serialVersionUID = 序列化号;

注:Java中区分类的方式:类名不同则为不同类;类名相同则通过序列化号来查找。

反序列化 ObjectInputStream

要实现反序列化的类同样需要实现接口Serializable,反序列化的对象调用 .readObject(对象);方法来实现读入。

Flies类

是File类,而不是一个文件流,该类提供了大量的文件操作的方法。如删除文件,修改文件,得到文件修改日期,建立目录、列表文件等。具体的方法可以参考jdk帮助文档。