周一帆
摘 要 Android是市場占有率最大的一個平臺,Android平臺下的APP也各式各樣,各種各樣的文本閱讀器也隨之產(chǎn)生。傳統(tǒng)IO流與NIO流相差甚大,但在JDK 1.4 中原來的 I/O 包和 NIO 已經(jīng)很好地集成了,所以即使采用傳統(tǒng)IO流的方式讀取速度也不會相差很大。讀取方式需要采取分塊讀取的方式,否則會很占內(nèi)存。文本閱讀器還需要解決的問題有編碼問題,一個好的文本閱讀器應(yīng)該支持多種編碼格式的文本。
關(guān)鍵詞 Android IO 文本閱讀器 編碼
中圖分類號:TP3 文獻標識碼:A
現(xiàn)如今,移動市場發(fā)展十分迅速,而Android是移動市場中所占比例最大的一個平臺。截至2013年年底,Android的市場占有率從2012年的68.8%提升至78.9%,而蘋果的IOS則從2012年的19.4%下降到15.5%,Microsoft的Windows Phone則從2.7%上升到3.6%??梢钥闯觯谥悄苁謾C市場已經(jīng)接近飽和的情況下,IOS平臺和WP平臺小幅波動下,Android平臺在上升了10個百分點,實屬不易。相較于IOS,Android系統(tǒng)比較開放,比較大眾化,而且支持Android系統(tǒng)的手機也比較多,所以很多人愿意選擇系統(tǒng)。
對于Android而言,Android應(yīng)用程序是JAVA語言編寫的。同時,對于JAVA語言而言,Android平臺的出現(xiàn),讓JAVA語言重生,因為Android平臺應(yīng)用開發(fā)的語言就是JAVA,這讓許多癡迷于APP開發(fā)的開發(fā)者們都紛紛深入了解JAVA。
Android響應(yīng)速度主要指的是JVM,即JAVA 虛擬機的速度。隨著各式各樣的APP的風靡,文本閱讀器也隨處可見。對于大文本來說,文本閱讀器的性能好壞就體現(xiàn)在響應(yīng)速度上。
對于手機等移動設(shè)備來說,運行內(nèi)存實在有限。所以,處理起各種應(yīng)用來最需要保證的就是占用內(nèi)存不能太大。而對于文本閱讀器來說,如果用傳統(tǒng)的方式去讀取,然后將讀取到的全部存起來,如果這個文本有1G,那么這個程序就該被列入最爛APP排行榜了。
所以,Android文本閱讀器需要最解決的問題就是內(nèi)存的問題。所以現(xiàn)在的解決方案就是,少讀取到內(nèi)存。但是文本閱讀是一個動態(tài)的過程,沒有一個開發(fā)者會知道每一個使用者每次會讀多少的文本,會讀多大的文本。所以必須有一個合適的算法,來進行對這個未知的文本進行讀取。
對于JAVA而言,讀取文件需要的就是IO流。在J2SE1.4以上版本中發(fā)布了全新的I/O類庫,即NIO包。選取使用哪種IO流對文本閱讀器的速度也有很大的影響。在傳統(tǒng)I O流是面向流的,就是說這種流真的像流水一般,過去了就不能往回流。而NIO是面向緩沖的,它讀到的數(shù)據(jù)會存到一個緩沖區(qū)里。有了這個緩沖區(qū)事情就好辦了,必要的時候,它可以在緩沖區(qū)里前后移動。這就使得流使用起來方便了許多。除此之外,傳統(tǒng)IO流都是阻塞的,當一個線程調(diào)用了讀或者寫的方法的時候,該線程就會阻塞,直至數(shù)據(jù)完全取得或者數(shù)據(jù)完全寫入。這就降低了效率,而NIO是非阻塞的。當該線程啟動了流之后,該線程不需要等待數(shù)據(jù)完全取得或者完全寫入,就可以執(zhí)行其他的操作。經(jīng)過不完全準確測試,讀取一個10M的文本,使用NIO的所需要的平均時間為2秒,而使用傳統(tǒng)IO則平均需要3秒。
但在JDK1.4中原來的I/O包和NIO已經(jīng)很好地集成了。java.io.* 已經(jīng)以 NIO 為基礎(chǔ)重新實現(xiàn)了,所以現(xiàn)在它可以利用 NIO 的一些特性。這使得傳統(tǒng)IO雖然面向流,但是處理速度提高了不少。
這個時候還會遇到的一個問題是編碼問題,文檔的編碼方式有很多,一個文本閱讀器應(yīng)支持多種編碼。解決編碼問題的方式有多種,可以通過讀取文件頭來判斷。對于txt文檔來說,如果只需要支持UTF-8,Unicode和GBK的話,只需要讀取文件的頭兩個字節(jié)就可以了。網(wǎng)上也有一些開源的判斷編碼的jar包,比如說cpdetector.jar等。但是讀取文件頭是一種很不錯的選擇,因為相較于調(diào)用開源的jar包,讀取文件頭的方式十分快速。
再回到分塊讀取的問題上來。無論采用哪種流進行分塊讀取,定位都是一個很棘手的問題,比如說以字節(jié)讀取,那么就要根據(jù)編碼來處理定位,否則就會出現(xiàn)亂碼。如果直接讀取字符,比如說BufferedDRead里面的readline()方法。根據(jù)這種方法讀取雖然不會出現(xiàn)亂碼的問題,但是定位起來相當麻煩。但是采用內(nèi)存映射還是一種不錯的方法。
一個文本閱讀器的實現(xiàn)方法有很多種,基于Android的文本閱讀器需要考慮的最基本問題就是以上提出的用哪種流,如何編碼以及如何定位問題。
參考文獻
[1] 熊健.基于Android平臺的企業(yè)移動應(yīng)用開發(fā)框架的分析與設(shè)計[J].軟件,2012,33(11).
[2] 姚昱曼,劉衛(wèi)國. Android的架構(gòu)與應(yīng)用開發(fā)研究[M].湖南《計算機與現(xiàn)代化》2008,11.
[3] 李剛. 瘋狂Android講義(第2版).電子工業(yè)出版社,2013,3.
[4] 景寶玉.2010中國移動應(yīng)用開發(fā)現(xiàn)狀與趨勢大調(diào)查,2011.
[5] ITEYE.技術(shù)網(wǎng)站. http://www.iteye.com/
[6] JavaEE.技術(shù)社區(qū).http://www.j2eedv3.com/