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