1.1.3 JAVA IO包
1.1.3.1 存取程序狀態(tài)幾種方法--Java I-O應用
1.1.3.1.1 文件I/O:文件流→序列化
★文件流
文件操作是最簡單最直接也是最容易想到的一種方式,我們說的文件操作不僅僅是通過FileInputStream/FileOutputStream這么“裸”的方式直接把數(shù)據(jù)寫入到本地文件(像我以前寫的一個掃雷的小游戲JavaMine就是這樣保存一局的狀態(tài)的),這樣就比較“底層”了。
主要類與方法和描述
1. FileInputStream.read() //從本地文件讀取二進制格式的數(shù)據(jù)
2. FileReader.read() //從本地文件讀取字符(文本)數(shù)據(jù)
3. FileOutputStream.write() //保存二進制數(shù)據(jù)到本地文件
4. FileWriter.write() //保存字符數(shù)據(jù)到本地文件
★XML
和上面的單純的I/O方式相比,XML就顯得“高檔”得多,以至于成為一種數(shù)據(jù)交換的標準。以DOM方式為例,它關(guān)心的是首先在內(nèi)存中構(gòu)造文檔樹,數(shù)據(jù)保存在某個結(jié)點上(可以是葉子結(jié)點,也可以是標簽結(jié)點的屬性),構(gòu)造好了以后一次性的寫入到外部文件,但我們只需要知道文件的位置,并不知道I/O是怎么操作的,XML操作方式可能多數(shù)人也實踐過,所以這里也只列出相關(guān)的方法,供初學者預先了解一下。主要的包是javax.xml.parsers,org.w3c.dom,javax.xml.transform。
主要類與方法和描述
1. DocumentBuilderFactory.newDocumentBuilder().parse() //解析一個外部的XML文件,得到一個Document對象的DOM樹
2. DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() //初始化一棵DOM樹
3. Document.getDocumentElement().appendChild() //為一個標簽結(jié)點添加一個子結(jié)點
4. Document.createTextNode() //生成一個字符串結(jié)點
5. Node.getChildNodes() //取得某個結(jié)點的所有下一層子結(jié)點
6. Node.removeChild() //刪除某個結(jié)點的子結(jié)點
7. Document.getElementsByTagName() 查找所有指定名稱的標簽結(jié)點
8. Document.getElementById() //查找指定名稱的一個標簽結(jié)點,如果有多個符合,則返回某一個,通常是第一個
9. Element.getAttribute() //取得一個標簽的某個屬性的的值
10. Element.setAttribute() //設(shè)置一個標簽的某個屬性的的值
11. Element.removeAttribute() //刪除一個標簽的某個屬性
12. TransformerFactory.newInstance().newTransformer().transform() //將一棵DOM樹寫入到外部XML文件
★序列化
使用基本的文件讀寫方式存取數(shù)據(jù),如果我們僅僅保存相同類型的數(shù)據(jù),則可以用同一種格式保存,譬如在我的JavaMine中保存一個盤局時,需要保存每一個方格的坐標、是否有地雷,是否被翻開等,這些信息組合成一個“復合類型”;相反,如果有多種不同類型的數(shù)據(jù),那我們要么把它分解成若干部分,以相同類型(譬如String)保存,要么我們需要在程序中添加解析不同類型數(shù)據(jù)格式的邏輯,這就很不方便。于是我們期望用一種比較“高”的層次上處理數(shù)據(jù),程序員應該花盡可能少的時間和代碼對數(shù)據(jù)進行解析,事實上,序列化操作為我們提供了這樣一條途徑。
序列化(Serialization)大家可能都有所接觸,它可以把對象以某種特定的編碼格式寫入或從外部字節(jié)流(即ObjectInputStream/ObjectOutputStream)中讀取。序列化一個對象非常之簡單,僅僅實現(xiàn)一下Serializable接口即可,甚至都不用為它專門添加任何方法:
1. public class MySerial implements java.io.Serializable
2. {
3. //...
4. }
但有一個條件:即你要序列化的類當中,它的每個屬性都必須是是“可序列化”的。這句話說起來有點拗口,其實所有基本類型(就是int,char,boolean之類的)都是“可序列化”的,而你可以看看JDK文檔,會發(fā)現(xiàn)很多類其實已經(jīng)實現(xiàn)了Serializable(即已經(jīng)是“可序列化”的了),于是這些類的對象以及基本數(shù)據(jù)類型都可以直接作為你需要序列化的那個類的內(nèi)部屬性。如果碰到了不是“可序列化”的屬性怎么辦?對不起,那這個屬性的類還需要事先實現(xiàn)Serializable接口,如此遞歸,直到所有屬性都是“可序列化”的。
相關(guān)推薦:計算機等級考試二級Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |