天天看點

《Android 3D遊戲開發技術寶典——OpenGL ES 2.0》——2.4節檔案I/O

本節書摘來自異步社群《android 3d遊戲開發技術寶典——opengl es 2.0》一書中的第2章,第2.4節檔案i/o,作者 吳亞峰,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

2.4 檔案i/o

android 3d遊戲開發技術寶典——opengl es 2.0

i/o即輸入與輸出,幾乎所有檔案操作的工作都離不開i/o。對于android遊戲開發來說,i/o操作尤為重要,遊戲中的地圖資料、人物圖檔資源等的流暢讀取是保證遊戲可玩性的重要方面。是以在開發時,不同的場合必須選用合适的i/o操作方式,才能保證滿足使用者的需求。

android中檔案i/o分為3種方式:sd卡檔案讀取、手機中檔案夾的通路和應用程式中assets檔案的讀取,本節将結合簡單的小案例對這幾種檔案i/o操作進行介紹。

2.4.1 通路sd卡中的檔案

伴随着遊戲品質的不斷提高,遊戲資料占用的存儲空間也成幾何級數增加,以往幾十kb、幾mb的手機遊戲已經發展為幾十mb、幾百mb甚至幾個gb的大型手機遊戲。為了适應存儲需求的增長,sd卡也一直在進行更新換代,4gb、8gb、16gb大小的sd卡已随處可見。

android的設計者自然不會忽略這一點,在android平台上可以輕松地對手機sd卡中的檔案進行讀取和操作。下面通過一個案例來詳細講解在android開發中如何通路sd卡中的檔案。

1.案例的運作效果

運作本小節案例sample2_5,在輸入框中輸入要讀取的檔案名,然後單擊“打開檔案”按鈕。若sd卡中存在該文本檔案,則在文本區域顯示出檔案的内容,反之則提示未找到該檔案。本案例的運作效果如圖2-15、圖2-16所示。

《Android 3D遊戲開發技術寶典——OpenGL ES 2.0》——2.4節檔案I/O

提示 運作本案例時要注意sd卡中文本檔案的編碼格式,在android系統中一般要采用utf-8編碼才能保證沒有亂碼的出現。編碼格式為utf-8的文本檔案見随書CD光牒中源代碼/第2章目錄下的androidio.txt,讀者可以将該檔案導入到手機或模拟器的sd卡中再對本案例進行測試。

2.案例的開發

介紹完本案例的運作效果以及文本檔案編碼的注意事項後,接下來将對本案例的主要制類sample2_5_activity進行開發,其代碼如下。

第8-16行為打開檔案按鈕添加監聽器,監聽器功能為首先擷取文本框中使用者輸入的檔案名,然後調用從sd卡加載文本檔案的方法,擷取sd卡中的對應檔案内容并送入edittext控件顯示。

第17-32行為加載sd卡中文本檔案的方法,其入口參數為要加載檔案的檔案名。工作過程為首先用java 标準的i/o操作來加載指定文本檔案中的資料,然後将資料編碼為字元串,并替換換行符等空白字元,最後傳回加載的内容。

提示 通過上面的小案例可以看出,android中對sd卡檔案的i/o與标準java相同,是以開發成本很低,易于上手。

2.4.2 通路手機中的檔案夾

前一小節中是将檔案存放到sd卡中,其實檔案也可以存放在手機内部存儲(rom,相當于pc的硬碟)中。不過在android系統中,其為每個應用程式在手機的rom中都配置設定了一個私有的目錄,命名規則為“/data/data/<應用程式的包名>”。例如,應用程式的包名為“com.bn”,則系統配置設定的私有目錄為“/data/data/com.bn”。

應用程式開發時,若需要在rom中存放檔案,一般應該存放到系統配置設定的私有目錄中。啟動eclipse,進入其中的ddms面闆,打開file explorer,即可檢視手機rom中的檔案組織情況,如圖2-17所示。

《Android 3D遊戲開發技術寶典——OpenGL ES 2.0》——2.4節檔案I/O
《Android 3D遊戲開發技術寶典——OpenGL ES 2.0》——2.4節檔案I/O

說明 圖2-18為程式一開始運作,顯示“/”目錄下内容的情況。圖2-19為單擊進入了dev目錄,圖2-20為單擊了不允許進入或不是檔案夾的條目。

了解了本案例的運作效果之後,接下來對本案例中唯一的類——sample2_6_activity進行開發,具體代碼如下。

第9-30行為案例整體功能的實作代碼。程式運作時,首先調用initlistview方法初始化檔案顯示清單,顯示根目錄下的檔案情況。然後給“傳回上一層”按鈕添加了監聽器,監聽器功能為若存在上一層目錄,則重新整理檔案顯示清單為上一層目錄下的情況。

第32-35行為擷取目前路徑下所有檔案清單的方法。該方法中首先需要獲得目前路徑對應的file對象,之後傳回其下對應的檔案清單。

提示 由于篇幅所限,初始化檔案清單的代碼省略,有需要的讀者請自行查閱CD光牒中的源代碼進行學習。

2.4.3 讀取assets檔案夾下的内容

android還支援将應用程式所需資料檔案打包到apk檔案中,省去了使用者安裝應用程式後還需要下載下傳資料包的情況。但是要注意的是,打包到apk檔案中的資料檔案并不是可以放在任何位置,一般應該放到項目中的assets檔案夾下。

提示 對于特别大(例如50mb)的資料檔案,在實際開發中一般還是與apk安裝檔案分開的。對于不大的資料檔案,就非常适合打包到apk包中的assets檔案夾下。

下面将通過一個小案例來說明如何程式設計通路assets檔案夾下的内容,其主要功能是完成對應用程式内部的assets檔案夾下檔案的讀取。操作過程為在案例初始界面可以輸入檔案名,然後單擊打開按鈕。若存在該檔案,則在下方顯示出檔案内容;反之則彈出toast提示使用者重新輸入。案例運作效果如圖2-21、圖2-22所示。

了解了本案例的功能後,下面來介紹本案例的開發過程,具體步驟如下。

(1)首先将androidio.txt文本檔案複制到項目中的assets檔案夾中,如圖2-23所示。

《Android 3D遊戲開發技術寶典——OpenGL ES 2.0》——2.4節檔案I/O
《Android 3D遊戲開發技術寶典——OpenGL ES 2.0》——2.4節檔案I/O

(2)将androidio.txt文本檔案複制到項目中的assets檔案夾後,接下來将開發本案例中唯一的類sample2_7_activity,其代碼如下。

第7-15行首先擷取了打開按鈕的引用,然後給此按鈕添加了監聽器。監聽器的功能為讀取使用者輸入名稱的檔案内容,并顯示到界面上。

第16-36行為從assets中加載指定名稱文本檔案的方法,其首先擷取了指向指定檔案的輸入流,然後從輸入流中讀取資料,接着将資料編碼為字元串,并替換換行符等空白字元,最後傳回加載的内容。

提示 通過上述幾個小節案例的介紹,相信讀者對android平台下檔案的存儲和讀取已經有所掌握。在真正的開發過程中,開發人員應該考慮各方面的因素,在需要時采用最适合自己的存儲方式進行存儲。

繼續閱讀