6、Libgdx文件处理

(官网:www.libgdx.cn

简介



Libgdx应用运行在四个不同的平台中:桌面系统(Windows,Linux,Mac OS X等等),Android,iOS和JavaScript或者WebGL。每个平台处理文件I/O有一些不同。

Libgdx文件模块提供了以下操作文件功能:

  • 从文件中读取
  • 写入到文件
  • 复制文件
  • 移动文件
  • 删除文件
  • 遍历文件和目录
  • 检测文件或目录是否存在

    在我们深入了解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版权所有,如需转载,注明出处)

时间: 2024-11-07 17:55:08

6、Libgdx文件处理的相关文章

最佳vim技巧

最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim.org         : 官方站点comp.editors        : 新闻组http://www.newriders.com/books/opl/ebooks/0735710015.html : Vim书籍http://vimdoc.sourceforge.net/cgi-bin/vim

Libgdx 之JSON文件解析

上一节我们学习了XML文件的解析,接下来我们再了解JSON文件的解析.在Libgdx中也提供了Json类来帮助我们解析文件,最常用的方法是fromJson(java.lang.Class type, FileHandle file) 通过此方法我们必须先定义一个内部类来抽象的表示Json文件. { "name": "David", "experience": 2534, "strength": 6, "dexteri

libgdx的菜单配置,以及json文件的结构

Game->stage stage之间的相互切换语句 ((Game) (Gdx.app.getApplicationListener())) .setScreen(new ScreenTwo()); 对于菜单画面 private Skin skin; private Stage stage; private Table table; //用来装按钮,文字等组件 private Label heading; private TextureAtlas atlas; private TextButto

Libgdx之国际化 中英文菜单切换

有时候我们做的游戏不仅仅发布在国内市场,有时候也需要发布在国际市场,这时候我们至少需要中英2套菜单来供不同的玩家使用,毕竟中文不是每个人都能看懂. Libgdx中提供了I18NBundle来供我们使用,I18NBundle提供了一套机制可以使我们从属性(properties)文件中加载资源, 属性文件中的资源是以"name"和"values"的形式存在的,而且资源最好有一个父文件,这样防止资源丢失时,可以使用父文件中的值: 通过上面图片可以看出string.prop

libgdx游戏框架介绍

libgdx作为上层为java,底层c和c++的游戏引擎.简直是优秀得一塌糊涂.  这个游戏框架最初只有1个人在维护,现在已经加入不少人了,越来越给力. libgdx的架构 很清晰, 我们先从包的结构分析: assets 代表资源包,用于资源加载等管理. audio 音频包,游戏需要播放声音时用. files 文件处理包,内部主要对象是FileHandle ,如果你用过Libgdx肯定对次很熟悉,libgdx加载纹理图片等都是通过此对象. graphics 绘画相关,就是我们要把游戏中的控件或者

Android游戏框架Libgdx使用入门

转载自:http://blog.csdn.net/cping1982/article/details/6176191 Libgdx作者博客:http://www.badlogicgames.com/ Libgdx项目地址:http://code.google.com/p/libgdx/ Libgdx是一款支持2D与3D游戏开发的游戏类库,兼容大多数微机平台(标准JavaSE实现,能执行在Mac.Linux.Windows等系统)与Android平台(Android1.5以上就可以使用.Andro

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

Libgdx 之SpriteBatch深入分析

Libgdx共享资源 因为Libgdx可以在多平台上运行,因此理论上资源应该放在core目录下,因为Android和桌面版都包含主目录.但是Android对于如何存放这些文件有严格的规则,我们必须把资源放在固定的目录下.因此如果创建的工程需要在Android设备下运行的话,必须把资源放在Android项目自动创建的资源目录下.如果只是练习的可以放在core工程下面. SpriteBatch的使用一 从上面涂可以看出SpriteBatch继承在Disposable,因此在游戏的最后必须调用disp

Libgdx学习笔记: 游戏如何在androidx86 2.2的vbox虚拟机测试运行

这个问题我花了一天半的时间才解决,换了无数个libgdx的版本,0.98.0.99 1.0 还有最新未发布的版本都测试了,虚拟机的版本也换了很多个,都不行 最后总结出来. vBox虚拟机上的androidx86 无论哪个版本,至少我测试的2.2 4.0 4.1 都无法成功运行 libgdx 的opengl es2.0版本的程序 先说下我为什么一定要虚拟机,因为androidAVD带的模拟器不能多个模拟器进行socket交互,我说的是超过2个,只有2个可以端口映射,3个以上就没办法了,而现在我做的