日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java程序文件格式設計

瀏覽:134日期:2024-06-24 15:41:59
內容: 一、概述 一個程序正式發行出去之后,如果要增加一些新的功能,往往意味著同時要修改用戶保存數據的方式,也就是必須更改程序保存文件的格式——通常是增加保存到文件的數據。有些時候,文件格式必須作徹底的改動,以配合實現程序的新功能。從這個意義上看,文件格式的發展/變化總是和程序的功能改進相呼應。 但是,大多數情況下,把原有的數據格式一丟了事是行不通的。動物王國中,不能適應環境意味著死亡;軟件領域也相似,新軟件是否支持原有的數據格式很大程度上決定了用戶是否升級。 不管軟件新增/改進了多少功能,不管新的文件格式是多么完美,如果新軟件不能利用原來的文件格式,用戶一般不太會認可新軟件。解決該問題的辦法包括: ●保留老代碼來讀取老文件。采用這種方案一般需要額外編寫一些代碼,把老文件轉換成新的格式(一般地,最簡單的辦法是先把老文件的數據轉換成新的內部對象,然后利用現有的寫入新版文件格式的對象)。這種辦法的好處是既保留了原有的代碼,又使它與新的文件格式兼容。但是,這種辦法有時可能導致丟失部分數據,不過總要比丟失全部數據好。 ●使新版軟件能夠讀/寫老文件格式。這種辦法工作量較大,因為程序的新版本一般會增加一些原來沒有的功能,老的數據格式中通常缺乏新功能必需的某些數據。 當新版軟件對原來執行任務的方式作了根本性的變動時,丟失數據決非難得一見的偶然事件。如果新版軟件采用和原來不同的方式達到同樣的效果,原來的功能可能不再有保留的必要。例如,如果一個程序原來用Swing做用戶界面,現在把它改成了Web(瀏覽器)用戶界面,原來的許多用戶界面設置就不再有效。 又如,如果有一個郵件程序,原來用的是以文件夾為基礎的索引,現在把它改成了以單詞為基礎的索引系統,在升級索引文件格式的過程中就有可能丟失許多信息;如果原來的索引文件保存了許多用戶配置選項和優化措施,在新的索引系統中這些數據可能無法利用。 這類問題沒有絕對完美的解決辦法,但是我們可以采取一些措施,使得升級文件格式帶來的負面影響盡可能小。Java串行化(Serialization)有著簡單易用的特點,日益成為一種保存文件的重要手段,有鑒于此,下面我們就來看看在軟件版本變更過程中,通過Java串行化保存的文件如何保持兼容性。 二、Java串行化 Java串行化有許多優點: ●容易使用。 ●如果一個對象連接到其他對象,串行化機制會保存所有相關的對象。 ●如果某個對象出現多次,串行化機制只保存一次。這一點極為重要,它不僅減小了文件空間,而且即使代碼寫得不是很老練,也不必擔心會出現無限循環(一個不老練的例子是,用遞歸的方式保存各個對象,卻又未能有效審計哪些對象已經保存,這時就有可能陷入永無終止的循環)。 遺憾的是,Java串行化機制定義的文件格式似乎很脆弱,只要稍微改動一下類的定義,原來保存的對象就可能無法讀取。例如,下面是一個簡單的類定義: public class Save implements Serializable{String name;public void save() throws IOException{FileOutputStream f = new FileOutputStream('foo');ObjectOutputStream oos = new ObjectOutputStream(f);oos.writeObject(this);oos.close();}}如果在這個類定義中增加一個域,例如final int val = 7;,再來讀取原來保存的對象,就會出現下面的異常: java.io.InvalidClassException:Save; local class incompatible:stream classdesc serialVersionUID = -2805284943658356093,local class serialVersionUID = 3419534311899376629上例異常信息中的數字串表示類定義里各種屬性的編碼值: ●類的名字(Save)。 ●域的名字(name)。 ●方法的名字(Save)。 ●已實現的接口(Serializable)。 改動上述任意一項內容(無論是增加或刪除),都會引起編碼值變化,從而引起類似的異常警報。這個數字序列稱為“串行化版本統一標識符(serial version universal identifier),簡稱UID。解決這個問題的辦法是在類里面新增一個域serialVersionUID,強制類仍舊使用原來的UID。新增的域必須是: ●static:該域定義的屬性作用于整個類,而非特定的對象。 ●final:保證代碼運行期間該域不會被修改。 ●long:它是一個64位的數值。 也就是說,新增的serialVersionUID必須定義成下面這種形式:static final long serialVersionUID=-2805284943658356093L;。其中數字后面加上的L表示這是一個long值。 當然,改動之后的類不一定能夠和原來的對象兼容。例如,如果把一個域的定義從String改成了int,執行逆-串行化操作時系統就不知道如何處理該值,顯示出錯誤信息:java.io.InvalidClassException: Save; incompatible types for field name。 Java串行化規范(http://java.sun.com/j2se/1.4.1/docs/guide/ serialization/spec/serialTOC.doc.html)提供了有關兼容的改動(http://java.sun.com/j2se/1.4.1/docs/ guide/serialization/spec/version.doc7.html)和不兼容改動(http://java.sun.com/j2se/1.4.1/docs/guide/ serialization/spec/version.doc8.html)的清單,這些清單指出了對類作了哪些改動之后仍可能讀取原來串行化的數據。具體細節比較復雜,但了解其主要機制還是很容易的: 簡而言之,如果文件中確實保存了所有必需的數據,那么仍有可能讀取該文件,當然前提是必須處理好串行化的UID。 三、引入版本編號 許多程序都在無意之中作出了這樣的假設:這種文件格式是我要用到的最后一種格式,以后不再需要制定新的格式,現在要做的是處理好在此之前的各種格式。這種程序會試圖讀取格式版本更高的文件,操作進行到一半才發現某些不能識別的數據,然后就是突然崩潰。如果文件包含了大量的元數據(描述文件本身的數據),處理起來就要容易得多。 在Java中,每一個域都由其名稱顯式標明,只要文件的改動不是很大(只添加了域,沒有被刪除或作重大更改的域),可以想象,用老軟件來讀取新文件格式不是什么難事,雖然有可能丟失一些信息,但可以搞清楚文件的基本情況。 文件格式隨著程序功能的改變而改變。理想情況下,程序應當做到既向后兼容(新的版本能夠按照老版本的格式讀取,甚至可能允許更新),同時做到向前兼容(較老的軟件能夠識別和處理新版的文件格式)。 通常,文件的版本無法從表面上一眼看出。大多數程序不會因為文件的版本不同而更改文件擴展名,而且目前尚無統一的標記文件版本的辦法。因此,有關文件格式的版本聲明只能在文件本身之內進行。如果你現在使用的文件格式還不包含版本聲明,最好在下次把文件升級成一個不兼容的版本時馬上加入版本標記,或者尋求一種在當前文件格式中加入版本標記但不會帶來負面影響的辦法。 版本信息一般在文件的開頭聲明,這是因為程序必須在處理文件之前首先檢查文件的版本,除非確定了文件的版本,否則不必讀取文件的其余部分。 按照慣例,文件版本編號包含兩個部分:主版本編號和次版本編號。一個特定版本的程序應當有最適合它處理的主-次版本號;主版本號變化意味著文件格式的重大變化,要繼續使用已經非常困難,必須作出重大修改才能升級到新的版本。 文件的主次版本號之前往往還可以加入另一項內容,稱為“魔術數字,它的作用就是保證程序處理的文件類型不會有誤(因為文件擴展名有可能不能唯一地標明文件類型)。例如,Java的類文件總是以下列字節內容開頭(十六進制):CA FE BA BE。目前還沒有這類數字的統一注冊機構,不過UNIX在/etc/magic下提供了一個清單(但并不完整)。魔術數字一般有四個字節,取值范圍很大,所以一般不必擔心會出現取值沖突的情形。 在編寫和維護必須讀/寫文件的代碼時,注意代碼的向前/向后兼容性是非常必要的。在處理文件的代碼中首先讀取文件版本,然后根據版本號將文件剩余內容傳遞給適當的處理方法;如果文件的版本太老,已不再支持,程序應當給出明確的提示。 四、結束語 文件格式設計是一個極其重要的話題,但本文還有許多細節問題尚未涉及。例如,對于大型文件,我們需要隨機訪問,而不是從前向后依次讀取文件內容的順序訪問,這樣就不必為了訪問文件最后幾個字節而讀取整個文件。無論是XML還是Java串行化對這類隨機訪問的支持都不是很理想,而且這類文件格式的發展變化比普通文件更難管理,因為他們依賴于字節級的訪問,稍微改動一下文件格式就可能導致不兼容。 如果要讓文件具有ACID特性——Atomicity、Consistency、Isolation和Durability,即原子性、一致性、隔離性、持久性,問題更加復雜。ACID與事務的概念密切相關,支持多用戶同時訪問一個文件。對于這類文件,可以考慮采用某種小型的數據庫系統,例如Birdstep或Sleepycat。不過這已經進入了文件格式管理的另一個領域,既涉及到數據庫管理軟件的版本,也涉及到數據模式設計的版本。 撇開這些復雜的問題不談,在實踐中,很多時候我們只需簡單的文件來保存數據,而且不會出現多用戶并發訪問,可以一次性地處理整個文件(或者至少適合使用順序訪問方式)。對于這些情形,最好在設計文件格式時就考慮版本問題,在日后的運行、維護中一定會帶來不少方便。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 一、概述 一個程序正式發行出去之后,如果要增加一些新的功能,往往意味著同時要修改用戶保存數據的方式,也就是必須更改程序保存文件的格式——通常是增加保存到文件的數據。有些時候,
標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区精品福利地址| 中文字幕在线免费观看视频| 欧美日韩国产传媒| 女人av一区| 日韩精品一二三四| 婷婷亚洲成人| 久久香蕉精品香蕉| 日韩综合精品| 亚州av乱码久久精品蜜桃| 三级欧美韩日大片在线看| 热久久国产精品| 国产欧美日韩视频在线 | 久久精品色播| 久久精品卡一| 亚洲综合三区| 国产精品探花在线观看| 日韩在线二区| 亚洲综合激情在线| 国产成人精品一区二区三区视频| 欧美精品羞羞答答| 日韩av不卡一区二区| 色爱综合网欧美| 日韩精品一级中文字幕精品视频免费观看 | 婷婷成人在线| 9999国产精品| 亚洲神马久久| 欧美极品一区二区三区| 久久在线免费| 日本中文字幕一区二区| 亚洲黄色免费av| 亚洲精选91| 天堂√中文最新版在线| 蜜臀久久99精品久久久久久9| 日韩精品一区二区三区免费视频| 国产精品一线| 91久久视频| 精品国产午夜肉伦伦影院| 亚洲欧美久久久| 成人欧美一区二区三区的电影| 黄色av一区| 久久久久久久久成人| 六月丁香综合| 97se综合| 国产色99精品9i| 亚洲一区区二区| 欧美激情亚洲| 热久久免费视频| 成人羞羞在线观看网站| 亚洲字幕久久| 亚洲a在线视频| 国产精品高清一区二区| 婷婷六月综合| 亚洲国产欧美日本视频| 国产欧美一区二区三区国产幕精品| 午夜免费一区| 亚洲综合在线电影| 国产精品巨作av| 99视频精品| 伊人久久国产| 欧美激情日韩| 欧美午夜网站| 日精品一区二区三区| 91精品国产91久久久久久黑人| 亚洲精选成人| 99综合视频| 精品在线91| 免费在线小视频| 精品国产欧美日韩| 青青草国产精品亚洲专区无| 中文一区一区三区免费在线观 | 日韩区一区二| 丝袜美腿亚洲一区二区图片| 激情综合网五月| 日韩在线看片| 婷婷精品在线观看| 麻豆成人av在线| 精品网站aaa| 久久gogo国模啪啪裸体| 欧美日韩免费看片| 精品国产成人| 成人午夜亚洲| 国际精品欧美精品| 麻豆91在线播放| 欧美日韩亚洲一区在线观看| 91在线成人| 国产日韩亚洲欧美精品| 日韩av影院| 久久国产乱子精品免费女| 欧美久久香蕉| 国产乱人伦精品一区| 国产精品一卡| 国产精品久久久久久久免费软件 | 国产精品www994| 国产午夜久久av| 国产乱子精品一区二区在线观看 | 免费亚洲一区| 国产一区二区三区四区五区传媒 | 精品精品国产三级a∨在线| 精品国产午夜| 99热国内精品| av免费不卡国产观看| 国产不卡av一区二区| 麻豆中文一区二区| 日韩激情视频网站| 欧美日韩一区二区三区不卡视频 | 精品黄色一级片| 精品精品99| 日韩成人综合| 午夜欧美视频| 国产偷自视频区视频一区二区| 91久久久久| 亚洲精品动态| 欧美国产日韩电影| 国产资源在线观看入口av| 久久国产日韩| 亚洲涩涩在线| 中文一区在线| 日韩不卡一区二区三区| 麻豆91在线播放| 91精品国产91久久久久久黑人| 国产亚洲欧洲| 亚洲精品人人| 久久久久久色| 久久久精品五月天| 伊人久久亚洲热| 亚洲精品护士| 麻豆精品av| 日韩精品永久网址| 99精品综合| 午夜日本精品| 午夜亚洲一区| 国产精品极品国产中出| 日韩一区欧美| 免费在线观看一区二区三区| 国产日韩精品视频一区二区三区| 国产精品亚洲综合色区韩国| 日韩大片在线观看| 蜜桃视频一区二区| 精品国产欧美| 在线日韩中文| 欧美日韩 国产精品| 人人香蕉久久| 国产亚洲欧美日韩精品一区二区三区 | 黄毛片在线观看| 99久精品视频在线观看视频| 中文字幕日韩亚洲| 久久久久久夜| 视频一区中文| 国产精品亚洲欧美日韩一区在线 | 国产精品久久久久久妇女| 日韩精品永久网址| 日韩精品免费观看视频| 久久久久久久久99精品大| 日本aⅴ免费视频一区二区三区| 亚洲成人精品| 三级久久三级久久久| 91欧美国产| 日韩精品免费一区二区夜夜嗨 | 视频精品一区二区| 国产精品二区不卡| 日日夜夜免费精品| 婷婷精品视频| 精品视频在线一区二区在线| 亚洲一区二区三区中文字幕在线观看| 国产精品99在线观看| 深夜日韩欧美| 亚洲精品一级二级| 亚洲精品少妇| 欧美不卡在线| 国产中文欧美日韩在线| 青青青国产精品| 国产精品视区| 欧美精品高清| 欧美aaaaaa午夜精品| 一区二区电影在线观看| 亚洲手机在线| 久久久久久自在自线| 国产精品一区二区三区美女| 爽好多水快深点欧美视频| 日韩欧美一区免费| 免费在线亚洲| 最新亚洲一区| 美日韩一区二区三区| 日韩精品一区二区三区中文在线 | 成人午夜精品| 精品国产aⅴ| 7777精品| 日韩欧美中文字幕一区二区三区| 一区在线视频观看| 久久亚洲精品中文字幕蜜潮电影| 久久久国产精品入口麻豆| 亚洲精品极品| 亚洲综合专区| 日韩一区精品视频| 99久久精品国产亚洲精品| 日韩88av| 荡女精品导航| 国产一区二区三区国产精品| 欧美a一区二区| 欧美激情日韩|