transient变量可标识出来不被序列化的字段,这些字段可能携带敏感信息,例如密码。但是这个关键字在我们重写了writeObject和readObject方法以后,不好使了。
序列化的使用忠告:
谨慎实现Serializable接口,需要随时保持uuid的时效性以及一致性,对于结构性框架中要避免不可序列化的类与已序列化的类之间的继承关系。
要考虑实现自定义的序列化形式,正如以上代码中我们所做的那样。
保护性的编写readObject方法。加入异常处理,让无效的序列化对象在反序列化过程中终端抛出异常。
四、PrintStream / PrintWriter首先请问java的标准输入流是什么?是InputStream,正确。那么java的标准输出流是什么?是OutputSteam?No!而是PrintStream。
因为标准输入输出流是System类的定义,System中有三个字段,in是InputStream类型,对应的是标准输入流,err和out都是PrintStream对象,out对应的是标准输出流。我们常用的System.out.println(data)方法的返回值就是PrintStream对象,此流默认输出在控制台,也可以重定向输出位置:
System.setOut(new PrintStream(new FileOutputStream(file))); System.out.println("这些内容只能在file对象的文件中才能看到哦!");PrintWriter就是PrintStream的字符操作的版本。PrintStream都是针对字节流进行操作的,如果要操作字符流,可以使用PrintWriter。下面直接看代码的注释吧。
package javaS.IO; +import java.io.FileOutputStream; public class PrintStreamS extends IOBaseS { /** * 打印流的使用非常类似于FileWriter,但是它支持更多的方法,同时也有着丰富的构造方法。 */ @Test public void testPrintStream() throws IOException { FileS.initEV(root + "HongXing.txt"); // PrintStream p = new PrintStream(root + "HongXing.txt"); // PrintStream p = new PrintStream(new File(root + "HongXing.txt")); // PrintStream p = new PrintStream(new FileOutputStream(root + // "HongXing.txt"), true, "UTF-8"); PrintStream p = System.out;// 数据源切换到控制台,标准输出,相当于System.out.xxx(); p.append("海上升明月"); p.println("润物细无声"); p.print("当春乃发生"); p.write("无敌心头好".getBytes()); p.flush();// 刷入内存数据到数据源 System.out.write("asdfas".getBytes()); p.close(); /** * 输出: * * 海上升明月润物细无声 * * 当春乃发生无敌心头好 */ } /** * PrintWriter与PrintStream的两点区别: * * write方法一个是写入字节,一个是写入字符。 * * 一般来讲,使用PrintStream多一些。 */ @Test // 如果忘记写该注解,执行JUnit会报错initializationError public void testPrintWriter() throws IOException { FileS.initEV(root + "HongXing.txt"); // PrintWriter p = new PrintWriter(root + "HongXing.txt"); // PrintWriter p = new PrintWriter(new File(root + "HongXing.txt")); // 第二个参数为autoflush,如果为true的话,println、printf和format会自动执行flush。 // PrintWriter p = new PrintWriter(new FileOutputStream(root + "HongXing.txt"), true); System.setOut(new PrintStream(new FileOutputStream(root + "HongXing.txt")));// 输出重定向,从默认的控制台转到文件,这也是日志系统的基本思想。 PrintWriter p = new PrintWriter(System.out, true);// 将PrintWriter的打印位置改到标准输出 p.append("海上升明月"); p.println("润物细无声"); p.print("当春乃发生"); p.write("无敌心头好");// 这是与PrintStream唯一区别了 p.flush();// PrintWriter也支持刷入操作 p.close(); } } 五、SequenceInputStream合并流,有两种构造函数:
传入两个InputStream类型的对象
传入一个枚举的InputStream类型的对象的集合,将它们合并起来进行操作