轉換流(字節流轉換爲字符流)
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.單例模式