1. 程式人生 > >整理筆記--Java基礎(數據流操作)

整理筆記--Java基礎(數據流操作)

ash 復雜度 持久 修飾 tran post AD exception 通過

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基礎(數據流操作)