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