本節書摘來異步社群《opengl es 3.x遊戲開發(上卷)》一書中的第2章,第2.4節,作者: 吳亞峰 責編: 張濤,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
i/o即輸入與輸出,幾乎所有檔案操作的工作都離不開i/o。對于android遊戲開發來說,i/o操作尤為重要,遊戲中的地圖資料、人物圖檔資源等的流暢讀取是保證遊戲可玩性的重要方面。是以,在開發時,不同的場合必須選用合适的i/o操作方式,才能保證滿足使用者的需求。
android中檔案i/o分為3種方式:sd卡檔案讀取、手機中檔案夾的通路和應用程式中assets檔案的讀取,本節将結合簡單的小案例對這幾種檔案i/o操作進行介紹。
伴随着遊戲品質的不斷提高,遊戲資料占用的存儲空間也成幾何級數增加,以往幾十kb、幾mb的手機遊戲已經發展為幾十mb、幾百mb甚至幾個gb的大型手機遊戲。為了适應存儲需求的增長,sd卡也一直在進行更新換代,4gb、8gb、16gb大小的sd卡已随處可見。
android的設計者自然不會忽略這一點,在android平台上可以輕松地對手機sd卡中的檔案進行讀取和操作。下面通過一個案例來詳細講解在android開發中如何通路sd卡中的檔案。
1.案例的運作效果
運作本節案例sample2_5,在輸入框中輸入要讀取的檔案名,然後單擊“打開檔案”按鈕。若sd卡中存在該文本檔案,則在文本區域顯示出檔案的内容,反之則提示沒有找到指定檔案。本案例的運作效果如圖2-15和圖2-16所示。

提示 運作本案例時要注意sd卡中文本檔案的編碼格式,在android系統中一般要采用utf-8編碼才能保證沒有亂碼出現。編碼格式為utf-8的文本檔案,見随書中源代碼/第2章目錄下的androidio.txt,讀者可以将該檔案導入到手機或模拟器的sd卡中再對本案例進行測試。
2.案例的開發
介紹完本案例的運作效果以及文本檔案編碼的注意事項後,接下來将對本案例的主要制類sample2_5_activity進行開發,其代碼如下。
第8-16行是為打開檔案的按鈕添加監聽器,監聽器的功能為首先擷取文本框中使用者輸入的檔案名,然後調用從sd卡加載文本檔案的方法,擷取sd卡中的對應檔案内容并送入edittext控件顯示。
第17-32行為加載sd卡中文本檔案的方法,其入口參數為要加載檔案的檔案名。工作過程為首先用java 标準的i/o操作來加載指定文本檔案中的資料,然後将資料編碼為字元串,并替換換行符等空白字元,最後傳回加載的内容。
通過上面的小案例可以看出,android中對sd卡檔案的i/o實作與标準java相同,是以,開發成本很低,易于上手。
前一小節中是将檔案存放到sd卡中,其實檔案也可以存放在手機内部存儲(rom,相當于pc的硬碟)中。不過在android系統中,其為每個應用程式在手機的rom中都配置設定了一個私有的目錄,命名規則為“/data/data/<應用程式的包名>”。例如,應用程式的包名為“com.bn”,則系統配置設定的私有目錄為“/data/data/com.bn”。
應用程式開發時,若需要在rom中存放檔案,一般應該存放到系統配置設定的私有目錄中。啟動eclipse,進入其中的ddms面闆,打開file explorer,即可檢視手機rom中的檔案組織情況,如圖2-17所示。
下面給出一個浏覽手機rom中檔案夾的小案例,通過單擊檔案夾的名稱,可以打開相應的檔案夾,顯示其中的檔案清單。運作本案例,其運作效果如圖2-18、圖2-19和圖2-20所示。
圖2-18為程式一開始運作,顯示“/”目錄下内容的情況。圖2-19為單擊進入了dev目錄,圖2-20為單擊了不允許進入或不是檔案夾的條目。
了解了本案例的運作效果之後,接下來對本案例中唯一的類——sample2_6_activity進行開發,具體代碼如下。
第9-30行為案例整體功能的實作代碼。程式運作時,首先調用initlistview方法初始化檔案顯示清單,顯示根目錄下的檔案情況。然後給“傳回上一層”按鈕添加了監聽器,監聽器功能為若存在上一層目錄,則重新整理檔案顯示清單為上一層目錄下的情況。
第32-35行為擷取目前路徑下所有檔案清單的方法。該方法中首先需要獲得目前路徑對應的file對象,之後傳回其下對應的檔案清單。
由于篇幅所限,初始化檔案清單的代碼省略,有需要的讀者請自行查閱中的源代碼進行學習。
android還能将應用程式所需的資料檔案打包到apk檔案中,省去了使用者安裝應用程式後還需要下載下傳資料包的情況。但是要注意的是,打包到apk檔案中的資料檔案并不是可以放在任何位置,一般應該放到項目中的assets檔案夾下。
對于特别大(如50mb)的資料檔案,在實際開發中一般還是與apk安裝檔案分開的。對于不大的資料檔案,就非常适合打包到apk包中的assets檔案夾下。
下面将通過一個小案例來說明如何程式設計通路assets檔案夾下的内容,其主要功能是完成對應用程式内部的assets檔案夾下檔案的讀取。操作過程為首先在案例初始界面輸入檔案名,然後單擊打開按鈕。若存在該檔案,則在下方顯示出檔案内容;反之,則彈出toast提示使用者重新輸入。案例運作效果如圖2-21和圖2-22所示。
了解了本案例的功能後,下面來介紹本案例的開發過程,具體步驟如下。
(1)首先将androidio.txt文本檔案複制到項目中的assets檔案夾中,如圖2-23所示。
(2)将androidio.txt文本檔案複制到項目中的assets檔案夾後,接下來将開發本案例中唯一的類sample2_7_activity,其代碼如下。
第8-17行首先擷取了打開按鈕的引用,然後給此按鈕添加了監聽器。監聽器的功能為讀取使用者輸入名稱的檔案内容,并顯示到界面上。
第18-36行為從assets中加載指定名稱文本檔案的方法,其首先擷取了指向指定檔案的輸入流,然後從輸入流中讀取資料,接着将資料編碼為字元串,并替換換行符等空白字元,最後傳回加載的内容。
通過上述案例的介紹,相信讀者對android平台下檔案的存儲和讀取已經有所掌握。在真正的開發過程中,開發人員應該考慮各方面的因素,在需要時采用最适合自己的存儲方式進行存儲。