第六章 Libgdx之文件处理

Android游戏开发群:290051794
Libgdx游戏开发框架交流群:261954621 

 

Libgdx的文件模型可以向你提供:

1、 读取文件。

2、 写入文件。

3、 复制文件。

4、 移动文件。

5、 删除文件。

6、 列出文件和目录。

7、 检查文件或目录是否存在。

Android系统中,文件可以以资源或assets的形式存储在应用的APK内。这些文件是只读的。Libgdx仅仅使用assets机制,它提供了原始的访问字节流的方法,更适合传统的文件系统。资源文件适于普通的应用,但用在游戏上时会产生一些问题。Android会在加载他们时对他们进行控制,比如自动调整图像大小。

Assets存储在Android项目下的assets文件夹,会在你部署应用时自动打包到APK文件里。其它应用没有访问assets文件夹的权限。

文件也可以存储在内部存储器,可以进行读写。每个已经安装的应用都会有一个专有的内部存储目录。这个目录只能被这个应用读写。可以认为这个文件夹是改应用的专属区。

最后,文件可以存储在外部存储区,比如SD卡。外部存储不总是可用,比如用户拔出SD卡。如果文件读写频繁,可以选择存储在这个地方。写入外部存储需要在AndroidManifest.xml文件中添加相关权限。

文件(存储)类型

Libgdx中的文件有一个文件处理类的实例表示。这个文件处理类中定义了文件存储位置。

类型

描述,文件路径和特性

Classpath

Classpath文件直接存储在源文件夹。这些直接打包到你的jar包而且是只读的。它们有存在的意义,但是要尽量避免。

Internal

Internal文件是指存储在Android项目下的assets文件夹。这些文件时只读的。如果文件不能在assets文件夹下找到,文件模块会搜索classpath类型的文件。

Local

Local文件在Android中存储在应用的内部存储中。

External

存储在SD卡中

Absolute

文件的完全路径。

Internal文件:所有的打包在应用中的文件(图像,音频等)。

Local文件:如果你需要小的文件比如存储游戏状态,使用Local文件。只有当前应用可以读写。如果想存储值,可以考虑Preferences

External文件:如果你需要写入大的文件,比如截图,或者从网络下载文件,可以考虑外部存储。注意:外部存储的文件是灵活的,意味着用户可以删除或写入文件。

检查存储可用性和路径

可以通过文件模块查询存储是否可用:

boolean isExtAvailable = Gdx.files.isExternalStorageAvailable();

boolean isLocAvailable = Gdx.files.isLocalStorageAvailable();


 

你也可以通过以下方式获取以下方式获取内部存储和外部存储的根目录:

String extRoot = Gdx.files.getExternalStoragePath();

String locRoot = Gdx.files.getLocalStoragePath();


 

获取文件句柄

一个文件句柄可以通过以上提到的文件模型获取。以下代码获取myfile.txt文件:

FileHandle handle = Gdx.files.internal("data/myfile.txt");


 

文件句柄实例通过方法传递,负责文件读写。比如通过一个Texture类加载一个图形,或者通过音频模块加载音频文件。

获取和检查文件的属性

有时需要检查一个文件是否存在或者或获取一个目录,文件句柄通过简洁的方法完成这些。

以下是检查文件是否存在或者目录是否为目录。

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) {

   // do something interesting here

}


 

我们同样可以可以获取父目录的文件,或者在目录中创建文件。

FileHandle parent = Gdx.files.internal("data/graphics/myimage.png").parent();

FileHandle child = Gdx.files.internal("data/sounds/").child("myaudiofile.mp3");


 

parent会指向“data/graphics”,child会指向”data/sounds/myaudiofile.mp3”

文件句柄中有很多的方法来查看文件的属性。可以查看相关文档。

错误处理

有些文件句柄的操作可能失败。这里使用“RuntimeExceptions”检查异常。

从文件读取

获取文件句柄后,我们可以将它传递给从文件中载入内容的类,或者读取里面的内容。后者是通过文件句柄中的输入方法实现。下面是示例:

FileHandle file = Gdx.files.internal("myfile.txt");

String text = file.readString();


 

如果你有二进制数据,可以很容易的加载到数组中:

FileHandle file = Gdx.files.internal("myblob.bin");

byte[] bytes = file.readBytes();


 

文件句柄类的更多更能,可以参考相关文档。

写入文件

跟读取文件一样,文件句柄同样提供写入文件的方法。注意只有Localexternalabsolute文件类型支持写入文件。实例:

FileHandle file = Gdx.files.local("myfile.txt");

file.writeString("My god, it's full of stars", false);


 

writeString的第二个参数表示是够将第一个参数附加到文件。如果为false,当前文件被覆盖。

当然可以将二进制数据写进文件:

FileHandle file = Gdx.files.local("myblob.bin");

file.writeBytes(new byte[] { 20, 3, -2, 10 }, false);


 

删除、复制、重命名和移动文件或目录

这些操作同样只对localexternalabsolute有效。

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();


 作者:宋志辉 
出处:http://blog.csdn.net/song19891121
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 
支持: 新浪微博 腾讯微博

上一篇:机器学习实战第五章(Chapter5):Logistic回归-程序原理详解


下一篇:Android下Activity的生命周期