六、Libgdx文件處理

(官網:www.libgdx.cnjava

簡介android


Libgdx應用運行在四個不一樣的平臺中:桌面系統(Windows,Linux,Mac OS X等等),Android,iOS和JavaScript或者WebGL。每一個平臺處理文件I/O有一些不一樣。瀏覽器

Libgdx文件模塊提供瞭如下操做文件功能:網絡

  • 從文件中讀取工具

  • 寫入到文件spa

  • 複製文件xml

  • 移動文件遊戲

  • 刪除文件圖片

  • 遍歷文件和目錄ip

  • 檢測文件或目錄是否存在
    在咱們深刻了解Libgdx的文件模塊以前,首先了解一下各個系統的差別。

各個平臺文件系統


這裏咱們簡單的瞭解一下Libgdx支持的各個平臺的文件系統。

Desktop(Windows,Linux,Mac OS X等等)


在桌面系統中,文件系統是一個大塊的內存。文件能夠經過當前的工做目錄或者絕對路徑被引用。能夠忽略相關權限,文件和目錄一般能夠被全部的程序讀寫。

Android


在Android中狀況有一點複雜。文件能夠經過資源或者assets的形式存儲在應用的APK中。這些文件是隻讀的。Libgdx僅僅使用assets機制,assets提供了對原始文件的比特流的訪問而且最接近傳統的文件系統。資源文件適用於Android的常規的應用,可是在用到遊戲當中時會遇到不少問題。Android在載入時能夠控制資源文件,好比自動調整圖片大小。

Assets存儲在Android項目的assets目錄下而且將被打包到APK中,其它的應用不能夠訪問這些文件。

文件也能保存到內部存儲中,能夠進行讀寫。每個安裝的應用都有一個獨立的目錄,這個目錄只有這個應用纔有訪問權限。能夠將這種存儲視爲應用的私有存儲空間。

文件也能夠存儲到外存中,像SD卡。外存並非全部的時候均可用。文件存儲的目錄不穩定,在使用外存以前,你須要在AndroidManifest.xml中添加相關權限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

iOS


在iOS中全部文件類型暫不可用。

Javascript或WebGL


一個原始的Javascript或WebGL應用沒有一個傳統的文件系統的概念。像圖片等資源經過URL來實現。如今瀏覽器統一支持本地存儲,這和傳統的文件系統基本相似。

Libgdx提供給你對於只讀文件系統的一種抽象。

文件(存儲)類型


在Libgdx中的文件表明了一個FileHandle類的實例,一個FileHandle有一個指定了文件存儲位置的類型。

類型 描述 Desktop Android HTML5 iOS
Classpath 只讀 是的 是的 是的 是的
Internal 只讀 是的 是的 是的 是的
Local 讀寫 是的 是的 是的 是的
External 讀寫 是的 是的 是的 是的
Absolute 讀寫 是的 是的 是的 是的

相對路徑和classpath文件一般是在工具中使用,對遊戲來講是能夠忽略的,你能使用的三種類型以下:

  • Internal文件:全部的assets(圖片,音頻文件等)都是internal文件。若是你使用Setup UI(也就是Gdx-setup),只須要將他們放置到Android項目的assets文件夾。

  • Local文件:若是你須要寫入到文件中某些數據,好比遊戲狀態,使用local文件。對你的應用來講是私有的。若是是存儲key或者之,能夠使用Preferences。

  • External文件:若是須要寫入大的文件,好比截屏,或者從網絡上下載文件,須要使用external存儲。注意的是,external能夠被用戶刪除。

檢測存儲和路徑的可用性


不一樣的存儲類型可能在不一樣的平臺不能使用。能夠經過文件模塊來判斷是否可用。
boolean isExtAvailable = Gdx.files.isExternalStorageAvailable();
boolean isLocAvailable = Gdx.files.isLocalStorageAvailable();
一樣能夠查詢external和local存儲的根目錄:
String extRoot = Gdx.files.getExternalStoragePath();
String locRoot = Gdx.files.getLocalStoragePath();

獲取文件處理
FileHandle能夠經過文件模塊獲取上述的類型,接下來的代碼是獲取internal的myfile.txt文件。
FileHandle handle = Gdx.files.internal("data/myfile.txt");

列出和檢查文件屬性

有些時候檢測特定的文件是否存在或者列出當前目錄的文件是必要的。FileHandle提供了簡潔的方法來實現。
如下是一個實例,檢測文件是否存在,是不是文件夾。
boolean exists = Gdx.files.external("doitexist.txt").exists();
boolean isDirectory = Gdx.files.external("test/").isDirectory();

列出指定目錄的全部文件或文件夾:
FileHandle[] files = Gdx.files.local("mylocaldir/").list();
for(FileHandle file: files) {
// 在這裏作你想要作的事情。
}
警告:若是沒指明文件夾,list將爲空。

注意:internal目錄在Desktop下不支持。

咱們能夠查詢文件的父文件夾:
FileHandle parent = Gdx.files.internal("data/graphics/myimage.png").parent();

還有更多的功能,能夠查閱javadoc文檔。

注意:這些方法大部分不支持HTML5。

錯誤處理


有些時候,經過FileHandle操做文件可能致使失敗。咱們能夠使用RuntimeExceptions來捕獲異常。在90%的狀況下,咱們訪問的文件是已知存在的。

讀取一個文件


獲取FileHandle以後,咱們能夠載入文件內容,或者讀取內容。
FileHandle file = Gdx.files.internal("myfile.txt");
String text = file.readString();

若是你是讀取二進制數據,能夠經過如下方式。
FileHandle file = Gdx.files.internal("myblob.bin");
byte[] bytes = file.readBytes();

還有更多的方式,能夠查閱javadocs。

寫入到文件


跟讀取文件相同。須要注意的是,只有local,external和absolute文件類型支持寫入。
FileHandle file = Gdx.files.local("myfile.txt");
file.writeString("My god, it's full of stars", false);

刪除,複製,重命名和移動文件或文件夾


這些操做一樣是在local,external和absolute文件類型下操做。
FileHandle from = Gdx.files.internal("myresource.txt");
from.copyTo(Gdx.files.external("myexternalcopy.txt");

Gdx.files.external("myexternalcopy.txt").rename("mycopy.txt");
Gdx.files.external("mycopy.txt").moveTo(Gdx.files.local("mylocalcopy.txt"));

Gdx.files.local("mylocalcopy.txt").delete();
www.libgdx.cn版權全部,如需轉載,註明出處)

相關文章
相關標籤/搜索