流对象的简析
对象流:有的时候,我们可能需要将内存中的对象持久化到硬盘上,或者将硬盘中的对象信息读到内存中,这个时候我们需要使用对象输入输出流。
序列化: 是对象转换成一个字节序列的过程,是一个写操作
反序列化: 一个字节序列转换成对象的过程 ,是一个读操作
ObjectOutputStream
构造器:
ObjectOutputStream(OutputStream out)
创建一个指定字节输出流的对象输出流对象。
常用方法: 除了提供了一些基本数据类型的写方法外,还提供了
void writeObject(Object obj)
将内存中的对象持久化到硬盘上
ObjectIntputStream
ObjectIntputStream(OutputStream out)
创建一个指定字节输入流的对象输入流对象。
常用方法:除了提供了一些基本数据类型的读方法外,还提供了
Object readObject();
从硬盘上读取一个字节序列,转换成对象
Serializable:序列化接口
如果想将对象序列化,那么对象的类型必须实现此接口。此接口
内什么都没有,只是一个序列化标识。
serialVersionUID:
每个能序列化的对象,在被序列化时,系统会默认给此对象的类计算一个
序列化版本号。不同的平台默认提供的序列化版本号多数情况下不会相同。因此当我们反序列时,如果硬盘里存储的对象的版本号与当前设计的类型的版本号不一致。
会出现运行时异常:
java.io.InvalidClassException,这种情况叫不兼容问题。
如果我们想解决不兼容问题。我们应该手动提供版本号。尽可能的相同这样来解决不兼容问题。
另外一种情况:
序列化过后,可能会修改类型,如果使用系统默认提供的版本号,在反序列时,会有异常,如果手动提供,不出现异常多出来的成员变量,以默认值的形式,赋值给反序列化回来的对象。
transient:成员变量的一个修饰词,可以理解为瘦身。
有的时候,在序列化对象时,我们不需要将对象的某些成员变量值持久化到硬盘上(因为不重要),此时,我们可以在这些成员变量前添加修饰词transient(保存时,进行减肥)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
字符流:
在输出输入操作时,以字符为单位进行操作,默认是unicode编码集。
字符流的抽象父类分别是:
Writer/Reader
Writer提供了字符输出流的常用方法
void close():关闭
void write(char[] cbuf):写一个字符数组
void write(char[] cbuf, int off, int len)写一个字符数组的一部分
write(int c):写一个字符
write(String str):写一串字符
write(String str, int off, int len) 写字符串的一部分
Reader提供了字符输入流的常用方法
int read():读一个字符,存储到int的低16位
int read(char[] cbuf):将数据读进字符数组中,返回的是读取的有效字符个数
int read(char[] cbuf, int off, int len) 将字符读入数组的一部分。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
子类中转换流:
OutputStreamWriter:
将字符转换成字节写出到硬盘上
构造器:
OutputStreamWriter(OutputStream out)
创建一个指定字节输出流的字符输出流对象,采用的是系统默认的编码集
OutputStreamWriter(OutputStream out, Charset cs)
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
OutputStreamWriter(OutputStream out, String charsetName)
创建一个指定字节输出流的字符输出流对象,采用指定编码集。
write(int a);
当a的低16位,如果被设计成相应的字符时,如果两个字节都是
有效字节,会写出两个。如果低16位对应是无效字符,或是有效字节只有一位时,会写一个字节。
InputStreamReader()
将字节转换成字符读进程序中
构造器:
InputStreamReader(InputStream in)
创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
InputStreamReader(InputStream in, CharsetDecoder dec)
InputStreamReader(InputStream in, String charsetName)
创建一个使用指定字符集的InputStreamReader。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
缓冲流:
PrintWriter:提供了丰富的方法,比BufferedWriter更加常用,此类型提供了
行自动刷新的功能
构造器:
PrintWriter(File file)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(String fileName)
PrintWriter(Writer out)
PrintWriter(Writer out, boolean autoFlush)
上述构造器,有第二个参数的,可以设置为true,表示行自动刷新。
只有一个参数的构造器,相当有两个参数时,设置为false的情况,即取消了行自动刷新的功能
常用方法:
println()
通过写入行分隔符字符串来终止当前行。
println(boolean x)
打印一个布尔值,然后终止该行。
void println(char x)
打印一个字符,然后终止该行。
void println(char[] x)
打印字符数组,然后终止行。
void println(double x)
打印双精度浮点数,然后终止行。
void println(float x)
打印一个浮点数,然后终止该行。
void println(int x)
打印一个整数,然后终止该行。
void println(long x)
打印一个长整型,然后终止行。
void println(Object x)
打印一个对象,然后终止该行。
void println(String x)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BufferedReader:提供了一个缓冲区
构造器:
BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建使用指定大小的输入缓冲区的缓冲字符输入流。
常用方法:
String readLine():
读一行字符串,读至换行符号为止,返回的数据不包含换行符当返回值为null时,表示读至文件末尾
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
文件字符流:
FileWriter/FileReader
FileWriter:相当于OutputStreamWriter与FileOutputStream合起来的功能,内部也维护了一个缓冲区,但是需要手动flush
构造器:
FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)
append:表示追加,但是此流不能设置字符集。常用方法与 OutputStreamWriter的差不多
FileReader:相当于InputStreamReader和FileInputStream合起来的功能内部也维护了一个缓冲区
构造器:
FileReader(File file)
FileReader(String fileName)
常用方法与InputStreamReader的方法差不多
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
System是一个final修饰的类型
两个成员变量:
out:是PrintStream类型,默认的输出目的地是控制台console
in: 是InputStream类型, 默认的数据源是键盘