一、java.io.Reader和java.io.Writer
是所有字符流的超类,与字节流的超类平级,也是抽象类,里面规定了所有字符流必须具备的读写字符的方法。字符流最小的读写单位是char字符,但是底层实际读写的还是字节,只是字符与字节之间的转换工作由字符流来完成。
1、转换流:
java.io.InputStreamReader和OutputStreamWriter 他们是一对高级流,实际开发中我们在读写字符串而组建流连接时,他们是非常重要的一环,但是我们不会直接操作这两个流。
2、主要作用:
1、衔接其他高级字符流与字节流 2、将字符与字节按照指定字符集进行转换
二、BW和PW
java.io.BufferedWriter:内部有缓冲区,可以块写文本数据来加快写出数据的速度。 java.io.PrintWriter:带有自动行刷新功能的缓冲字符输出流,内部总是连接着BufferedWriter作为缓冲加速功能,更常用。
1、构造方法:
PrintWriter提供了直接对文件进行写操作的构造方法: ? ? ? ? PrintWriter(String filename) ? ? ? ? PrintWriter(File file)
内部会自动完成流的链接,对文件进行写文本操作。 ? ? ? ? PrintWriter(String filename,String csn) ? ? ? ? PrintWriter(File file,String csc)
创建的同时还可以指定字符集,推荐使用这种方式创建。实际开发中我们写出文本数据时都应该确定字符集,而不是使用系统默认的。
2、PW底层源码:
this(new BufferedWriter( new OutputStreamWriter (new FileOutputStream(file) ) );
在创建时默认是覆盖模式,想要追加,就在FOS改为(file,true);
当创建PrintWriter时,第一个参数为流,第二个参数可以传入一个boolean类型的参数。如果参数的值为ture,当前PrintWriter具有自动行刷新的功能,即每次调用println()后都会自动flush()。
3、写出方法:println()
4、简易记事本
/*
简易记事本:
程序启动后要求用户输入一个文件名,然后对该文件进行操作。之后用户在控制台输入的每一行字符都写入到该文件中。但用户单独输入exit时程序结束;
要求:创建PrintWriter并且自行创建流完成链接。
*/
public static void method3()throws Exception{
FileOutputStream fos = new FileOutputStream("./src/TXT/haha.txt",true);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fos,"UTF-8")),true);
Scanner sc = new Scanner(System.in);
System.out.println("请输入新增内容:");
while (true) {
String str = sc.next();
if(str.equals("exit")){
System.out.println("结束输入。");
break;
}
pw.println(str);
}
pw.close();
}
三、BR:
1、读入方法;?String readLine():
读取一行字符串并返回,返回的字符串中不包含这一行的换行符。若某一行中似乎一个空行(只有一个换行符),则返回一个空字符串。当返回值为null时,表示流读取到了末尾。
注:缓冲字符流第一次调用readLine()方法时并非只读取了第一行内容,二十一次性读取了若干字符并存入内部的缓冲区,然后仅将第一行内容进行返回而已,再次调用则返回第二行内容,以此类推。
?
?
四、对象流
java.io.ObjectOutputStream和ObjectInputStream 对象流是一对字节流,也是一对高级流,在流连接中的作用时进行对象的序列化(也叫串行化)与反序列化。方便我们进行对java对象的读写操作。
1、对象序列化:
也叫串行化,是将java对象按照其结构转换为字节序列的过程。
2、反序列化:
将字节序列还原为java对象的过程。
3、Serializable接口
Serializable接口中没有定义任何的字段和方法,这个接口称为签名接口,是编译器敏感的一个接口,只有实现该接口才可以进行序列化和反序列化,否则运行会出现异常。 序列化时:java.io.NotSerializableException 不可序列化异常 反序列化时:java.io.InvalidClassException 无效的类异常
关于版本号:serialVersionUID 序列化版本号
如果我们自己没有声明,接口会默认生成一个。 工作机制:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件的serivalVersionUID跟当前文件是否一致,如果一致则反序列化成功,否则说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者类型发生了变化,会抛出异常,反序列化失败。
序列化保存对象:
序列化用于保存的对象,所以只能保存对象的非静态成员变量,不能保存任何的成员方法和静态成员变量。而且序列化保存的只是变量的值,对于变量的任何修饰符都不能保存。
如果把类中的属性定义为static的话,在进行反序列化时就不能得到原本的值,就只能得到null。
transient关键字:
当一个类实现了序列化接口后,可以通过这个关键字修饰某个属性,那么当这个类的实例进行序列化时会忽略这个属性的值,达到对象瘦身的目的。
4、javaBean规范:
1、javaBean类必须是一个公共类,即访问属性应设置为public 2、必须有一个公共的无参构造 3、javaBean类不应该有公共属性,所有属性都应该是private修饰的 4、为私有属性提供符合命名规范的get和set方法 5、实现Serializable接口
5、类的实例写出方法:
[void]writeObject(Object o) ? ? ? ? 对象输出流提供了一个写出对象的方法,但是在写出对象时要求该对象所属的类必须实现Serializable接口,否则会抛出异常。
6、什么是对象的序列化?
当我们调用writeObject()方法将一个对象写出时,首先该对象经过对象流,它会将对象按照其结构转换为一组字节,这个过程称为对象的序列化。
7、什么是持久化?
序列化后的字节再经过对象流连接的文件流写出,而文件流会将这个字节最终写入到文件中(磁盘中)做长久保存这个过程称为数据持久化。
|