IO流相關總結筆記、系統標準輸入和輸出、Scanner用法、對象序列化操作流

 

轉換流(字節流轉換爲字符流)

InputStreamReader isr = new InputStreamReader(new FileInputStream(“qq.txt”,true)); 
簡寫:
FileReader fr = new FileReader(“qq.txt”,true);


OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“qq.txt”,”UTF-8"));//一般用默認字符編碼集,用什麼編碼寫,就用什麼編碼讀
簡寫:
FileWriter fw = new FileWriter(“qq.txt”);
osw.close();//關閉外部的流就是關閉內部的流

 

flush和close的區別

flush  只有輸出流緩衝區有這個方法,主要針對刷新緩衝區,把緩衝區的數據寫出去

close 主要是關閉流的操作,只不過在關閉流的同時,幫助我們刷新一次緩衝區

如果緩衝區滿了,也會默認刷新一次 (默認8192字節)

動態獲取換行符:

System.getPropertity(“line.seperator”);


系統標準輸入(System.in)和輸出(System.out)

從控制檯輸入一個字節

InputStream input = System.in;//System.in表示從控制檯讀
System.out.println(“請輸入”);
Int c = input.read();
System.out.println(“你讀到了:” +  (char)c);

利用系統標準輸入 自己寫讀一個字節數組

InputStream input = System.in;
System.out.println(“請輸入數據”);
byte[] bs = new byte[100];
Int total = input.read(bs);
System.out.println(“你輸入了:” + new String(bs, 0, total));

利用系統標準輸入 自己寫讀一行的方法

InputStream input = System.in;
System.out.println(“請輸入數據”);
BufferedReader br = new BufferedReader(new InputStreamReader(input));//input字節流轉換爲了字符流
String str = br.readline();
System.out.println(“你輸入了一行:” + str);

修改默認輸出方向

System.setOut(new PrintStream(“qq.txt"));
System.out.println(“HELLO WORLD”);//輸出到了qq.txt文件中

Scanner用法

Scanner sc = new Scanner(System.in);
System.out.println(“請輸入整數”);
While(true) {
    If(sc.hasNextInt()){
        System.out.println(“你輸入了整數:”+ sc.nextInt());
    }else{
        System.out.println(“輸入的不是整數!重來!”);
        //清空控制檯
        sc.nextline();
    }
}

 


對象序列化操作流

ObjectOutputStream

ObjectInputStream

Serializable

Serializable 序列化接口,是個標記接口,如果一個對象要被序列化,那該對象的類必須要實現序列化接口。

 

將對象以文本的形式保存到文件——>對象序列化

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“qq.txt"));
Person person = new Person(“大白”,15);  //Person類要實現Serializable接口
oos.writeObject(person);

將文本中保存過的對象讀取出來放在程序裏面 ——>對象反序列化

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“qq.txt"));
Object obj = ois.readObject();

如果對象的其中某一個屬性不想被序列化出去,那麼private無法做到,可以用transient修飾。

 

對象序列化是指的序列化跟對象有關的數據,也就是序列化只是序列化對象堆內存的數據,那麼static修飾的屬性無法被序列化,transient修飾的屬性也是無法被序列化的(是專門阻止序列化的)。

 

如果一個對象的屬性有引用數據類型,那麼在序列化時,如果在當前被序列化對象的堆內存中有這個引用類型屬性的值時,必須讓這個屬性的類實現序列化接口。

一旦該屬性有值,那麼就必須實現接口。

如果序列化一組對象?

序列化只能在一個文件中保持一個對象,

那麼保存一組對象我們可以選擇對象數組或集合。

 

總結序列化中遇到的問題:

1.屬性被static、transient修飾的無法被序列化

2.序列化和反序列中類發生改變,那麼以後序列化一個類,該類必須手動定義serializableUID

3.對象屬性有應用數據類型,那麼也要實現序列化接口

4.序列化一組對象,用的是數組的方式


裝飾者模式:用繼承做功能擴展時的類爆炸問題

在IO流中,裝飾者模式隨時可見,例如:BufferedReader/Writer BufferedInputStream/OutputStream等等。

 

如果功能擴展,第一個想到的不是繼承,而是擴展

 

步驟:

1.創建一個裝飾功能的類

2.把父類組合進來

2.通過構造器給這個對象賦值

4.定義一個裝飾功能的方法

5.優先調用原本功能

6.再定義裝飾功能


創建對象的方式

1.new

2.對象反序列化

3.單例模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章