六、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版权全部,如需转载,注明出处)

相关文章
相关标签/搜索