IO流:
操作的数据是否是纯文本数据?
是:Reader,Writer
不是:InputStream,OutputStream
为啥字节流用int接收而不用Byte?
-1代表返回条件(即补码形式的11111111)用字节流很有可能读到它。
把它假设成一个检测门,用int就是在数据前加上24个0,伪装通过检测门,在输出的时候又会默认去掉24个0。
为啥不用字节流操作字符,还要用字符流呢?
因为在不同的编码表中,中文占的字节数不一样。
注意事项:
1.字节流写入字符要用getBytes();
2.Writer自带2k缓冲区,如果不关流将会将内容写到缓冲区里。
缓冲流 (采用了装饰设计模式):
特有的方法:
1.readLine() 读一行,返回时不带换行符。
2.newLine() 写入一个换行符。
补充:newLine和\r\n的区别在于newLine是跨平台的,而\r\n只是在window上适用。
Java.util.Properties:一个可以将键值进行持久化存储的对象(Hashtable的子类)
IO流核心代码,拷贝
public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("E:\\read.txt"); FileOutputStream fos = new FileOutputStream("E:\\write.txt"); //int len; //byte[]arr=new byte[1024]; int b; //while((len=fis.read(arr))!=-1) { //fos.write(arr,0,len); while((b=fis.read())!=-1) { fos.write(b); } fis.close(); fos.close(); System.out.println("文件拷贝代码"); }
File类(略):
序列化:
就是把内存中的java对象转换成平台无关的二进制流,从而允许把其持久地保存在磁盘上。
Serializable Externalizable 两个可序列化接口的区别:
1.前者性能差,但是简单所以常用。
2.后者性能好,但是增加了编程复杂度。
transient关键字,被其修饰后,不会进行JVM默认的序列化操作。在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
反序列化java对象必须提供该对象的class文件,随着项目的升级,java如何保证两个class文件的兼容性?
java序列化机制允许为序列化类提供一个private static final的serialVersionUID值,用于标识java类的序列化版本。
writeObject和readObject方法:
1.在序列化过程中,如果被序列化的类中定义了writeObject和readObject 方法,虚拟机会试图调用对象类里的 writeObject和readObject 方法,进行用户自定义的序列化和反序列化。
2.如果没有这样的方法,则默认调用是 ObjectOutputStream的defaultWriteObject方法以及ObjectInputStream的defaultReadObject 方法。
3.用户自定义的 writeObject和readObject 方法可以允许用户控制序列化的过程,比如可以在序列化的过程中动态改变序列化的数值。
注意事项:
1.反射,序列化和反序列化都会破坏单例设计模式。
2.通过对Singleton的序列化与反序列化得到的对象是一个新的对象,这就破坏了Singleton的单例性。
3.要在Singleton中定义readResolve方法,并在该方法中指定要返回的对象的生成策略,就可以防止单例被破坏。