1.什麼是I/O
I/O: Java程序的輸入/輸出
Input: 從外部數據源中讀取數據
Output:向外部數據源寫出數據
2.什麼是流
流: 用來傳輸數據的對象
按照數據方向: 輸入流/輸出流
按照數據單位: 字節流(處理一切數據)/字符流(處理文本數據)
按照流的功能: 節點流(實際完成數據傳輸)/過濾流(爲節點流增強功能)
2.1字節流
類名 | 作用 | 常用方法 |
---|---|---|
InputStream/OutputStream | 所有字節流的父類 抽象類 | read()/write()/close() |
FileInputStream/FileOutputStream | 文件流 節點流 | |
BufferedInputStream/BufferedOutputStream | 緩衝流 | |
ObjectInputStream/ObjectOutputStream | 讀/寫對象 | readObject()<br/>writeObject() |
OutputStream fos = null;
try {
fos = new FileOutputStream("a.txt");
fos.write('A');
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if (fos!= null) fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
上下兩段代碼功能一樣,since JDK7,實現AutoCloseable接口的類都可以用 try-with-resources 結構,編譯器會把下面的代碼自動改寫成上面的。
try(FileOutputStream fos = new FileOutputStream("a.txt")){
fos.write('A');
}
catch(IOException e){
e.printStackTrace();
}
2.1.1對象序列化
利用ObjectStream去傳輸對象
只有實現了Serializable接口的對象才能序列化
對象的屬性如果又是一個對象,也需要可序列化.如果屬性是個集合,就要求集合中的所有元素都是可序列化的
用transient關鍵字修飾的屬性爲臨時屬性,不參與序列化
補充內容
爲了類的變化儘可能不影響反序列化的結果, 可以爲類添加serialVersionUID 私有靜態長整型的常量
控制類的版本號 . 當類的版本號修改時,意味着之前的序列化數據全部作廢
當反序列化一個類的對象時,如果這個類實現了Serializable接口,那麼可以直接還原對象,如果這個類沒實現Serializable接口(這個類必然是父類),那麼需要調用構造方法來創建對象
對象的克隆
對象的複製:在內存中複製出一個內容完全的相同的對象
Object類: clone() 返回Object 對象複製
-
覆蓋clone方法,將訪問修飾符提高到public
-
淺拷貝: Object.clone() 需要被克隆的類必須實現Cloneable接口
深拷貝: 對象複製過程中,對象的屬性如果又是對象,則遞歸的進行復制
利用 對象序列化 自定義克隆方法. 可以不實現Cloneable接口
使用 ByteArrayOutputStream 在JVM中將對象寫入字節數組, 再用ByteArrayInputStream將對象讀回來 public Object clone(){ try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(this); out.close(); byte[] data = bos.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(data); ObjectInputStream in = new ObjectInputStream(bis); Object o = in.readObject(); in.close(); return o; } catch (Exception e) { e.printStackTrace(); return null; } }
字符流
以字符爲單位傳輸數據 處理文本數據
字符的亂碼: 當編碼方式和解碼方式不統一時,可能會有亂碼問題(ASCII字符永遠沒有亂碼)
字符的常見編碼:
ASCII 編碼 英語字符 'A' - 65 'a' - 97 '0' - 48
ISO-8859-1 西歐字符
GB2312 簡體中文(有些繁體字和特殊字打不出來)
GBK GB2312的擴展
Big5 繁體中文
Unicode UTF-16 (char) 把一個字符編解爲16位,2B UTF-8(變長) 全球統一
字符流
Reader/Writer 字符流的父類 抽象類
FileReader/FileWriter 文件字符流 節點流
BufferedReader/BufferedWriter 緩衝 過濾流
PrintWriter 緩衝
InputStreamReader/OutputStreamWriter 橋轉換 將字節流轉換爲字符流 可以指定編解碼方式