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版权所有,如需转载,注明出处)
6、Libgdx文件处理的更多相关文章
- Libgdx 循环绘制图片时间隔的问题
在libgdx中使用循环绘制一张图片铺满某个区域时,有可能会遇到像素计算没有问题时,图块中间还是有约1像素的间隔,或者是本来没有间隔,做了缩放处理之后发现中间有间隔. 解法 当使用Texture加载图 ...
- Libgdx 开发指南(1.2) 应用框架——模块概览
模块概览 引言 LibGDX由一些为一个典型游戏架构中的各个步骤提供服务的模块组成. Input:为所有平台提供一致的输入模型与处理器.支持键盘.触屏.加速度传感器与鼠标. Graphics:使用硬件 ...
- Libgdx 开发指南(1) 应用框架
应用框架 模块 Libgdx包含五个核心接口与操作系统交互,各自实现了如下接口: Application:运行应用,向client通知应用层事件,例如窗口大小的改变(window resizing). ...
- 4.3、Libgdx启动类和配置
(原文:http://www.libgdx.cn/topic/45/4-3-libgdx%E5%90%AF%E5%8A%A8%E7%B1%BB%E4%B8%8E%E9%85%8D%E7%BD%AE) ...
- 日入过百优质消除手游数据分享—萌萌哒包子脸爱消除(游戏开发引擎:libgdx)
从2014年开始,消除游戏异常火爆,从消除小星星到腾讯的天天消除都赢得了海量用户.目前,各大市场上开心消消乐等游戏依旧火爆.消除游戏一直持续保持着女性和孩子的主流游戏地位.虽然市场上消除游戏种类很多, ...
- Libgdx New 3D API 教程之 -- Libgdx中使用Materials
This blog is a chinese version of xoppa's Libgdx new 3D api tutorial. For English version, please re ...
- 【开源java游戏框架libgdx专题】-13-开发工具-地图的使用
支持libGDX的地图编辑器有很多种,其中比较常用的工具为Tiled地图工具.Tiled是一款非常好用的地图编辑器.下载地址:http://www.mapeditor.org TiledMap类: 又 ...
- 【开源java游戏框架libgdx专题】-08-中文显示与绘制
libgdx虽然是由美国人Mario Zechner(即BadlogicGames)写的开源引擎,由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的,在libgdx中的汉字都 ...
- 【开源java游戏框架libgdx专题】-07-文件处理
介绍:文件处理在不同平台的文件管理是略有差异的 Desktop(Windows,Linux,Mac OS X等等):在桌面系统中,文件系统是一个大块的内存.文件可以通过当前的工作目录或者绝对路径被引用 ...
随机推荐
- 分享一个二维码图片识别控制台程序Demo
怎么用NuGet和配置log4net就不介绍了,直接上代码(QRDecodeDemo.zip). (Visual Studio 2015 下的项目,用的.NET Framework 4.5.2) 吐槽 ...
- python学习之路基础篇(第七篇)
一.模块 configparser configparser用于处理特定格式的文件,其本质是利用open来对文件进行操作 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [ ...
- Docker常见仓库Ubuntu
Ubuntu 基本信息 Ubuntu 是流行的 Linux 发行版,其自带软件版本往往较新一些. 该仓库提供了 Ubuntu从12.04 ~ 14.10 各个版本的镜像. 使用方法 默认会启动一个最小 ...
- ELK搭建
ELK安装 elasticsearch安装 * 下载elasticsearch-5.0.0.tar.gz,并解压. 通过elasticsearch.yml可设置host和port. vim confi ...
- 计算机网络中的TCP/IP模型
Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Inter ...
- FFmpeg源代码简单分析:avformat_open_input()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- MySQL输入密码后闪退,这里有解
不知道怎么的,我的MySQL就像抽风了一样,可能是不想理我了吧.只要我输入密码,它就会闪退.而且使用其他的数据库管理工具也是链接不成功的.于是下决心,调教调教它,于是有了下面的这些解决方案. 解决方法 ...
- UNIX网络编程——客户/服务器程序设计示范(六)
TCP并发服务器程序,每个客户一个线程 前面讲述了,每个客户一个进程的服务器,或为每个客户现场fork一个子进程,或者预先派生一定数目的子进程.如果服务器主机支持线程,我们就可以改用线程以取代子进程. ...
- 【Shader拓展】Illustrative Rendering in Team Fortress 2
写在前面 早在使用ramp texture控制diffuse光照一文就提到了这篇著名的论文.Valve公司发表的其他成果可见这里.这是Valve在2007年发表的一篇非常具有影响力的文章,我的导师也提 ...
- Linux:ssh_config快速访问服务器
在当前用户的根目录下: cd ~/.ssh vi config 编辑config内容为下面: ForwardAgent yes Host 1 Hostname 192.168.1.1 User roo ...