整理筆記--Java基礎(數據流操作)
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方法,並在該方法中指定要返回的對象的生成策略,就可以防止單例被破壞。
整理筆記--Java基礎(數據流操作)