【开源java游戏框架libgdx专题】-07-文件处理

时间:2021-06-01 18:20:07
介绍:文件处理在不同平台的文件管理是略有差异的
  • Desktop(Windows,Linux,Mac OS X等等):在桌面系统中,文件系统是一个大块的内存。文件可以通过当前的工作目录或者绝对路径被引用。可以忽略相关权限,文件和目录通常可以被所有的程序读写。
  • Android:
在Android中情况有一点复杂。文件可以通过资源或者assets的形式存储在应用的APK中。这些文件是只读的。Libgdx仅仅使用assets机制,assets提供了对原始文件的比特流的访问并且最接近传统的文件系统。资源文件适用于Android的常规的应用,但是在用到游戏当中时会遇到很多问题。Android在载入时可以控制资源文件,比如自动调整图片大小。
Assets存储在Android项目的assets目录下并且将被打包到APK中,其它的应用不可以访问这些文件。
文件也能保存到内部存储中,可以进行读写。每一个安装的应用都有一个独立的目录,这个目录只有这个应用才有访问权限。可以将这种存储视为应用的私有存储空间。
文件也可以存储到外存中,像SD卡。外存并不是所有的时候都可用。文件存储的目录不稳定,在使用外存之前,你需要在AndroidManifest.xml中添加相关权限。
1 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • iOS:在iOS中所有文件类型暂不可用。
  • Javascript或WebGL:
一个原始的Javascript或WebGL应用没有一个传统的文件系统的概念。像图片等资源通过URL来实现。现在浏览器统一支持本地存储,这和传统的文件系统基本类似。
Libgdx提供给你对于只读文件系统的一种抽象。
 
  • 在Libgdx中的文件代表了一个FileHandle类的实例,一个FileHandle有一个指定了文件存储位置的类型。
 
Type Descrption Desktop Android HTML5 ios
Classpath read-only Yes Yes NO Yes
Internal read-only Yes Yes Yes Yes
Local read-write Yes Yes No Yes
External read-write Yes Yes No Yes
Absolute 绝对路径,尽量少用 Yes Yes No Yes
 
    • 对于绝对路径和Classpath,通常用于桌面程序的路径,使用顺序应该像下面这样:
    1. Internal Files:与程序一起打包的所有 assets 下的文件都是内部文件(Internal Files)
    2. Local Files :如果您需要写一些小文件,如游戏的状态,使用 local Files.这些都是一般私有到应用程序中。
    3. External Files:如果你想写一些大文件,例如截图或者下载好的文件,可以存储到External Files,应该注意的是,外部文件是不稳定的,用户可以删除或者移动你写出的文件。
    • 检查存储可用性和路径
    • 你可以通过一下文件模型查询可用信息:
      • 1 boolean isExtAvailable =Gdx.files.isExternalStorageAvailable();
        2 boolean isLocAvailable =Gdx.files.isLocalStorageAvailable();
    • 还可以像这样查询文件的根路径:
      • 1 String extRoot =Gdx.files.getExternalStoragePath();
        2 String locRoot =Gdx.files.getLocalStoragePath();
      • 获取文件句柄
      • 1 FileHandle handle =Gdx.files.internal("data/myfile.txt");
        2 FileHandle handle =Gdx.files.classpath("myfile.txt");//将位于项目目录下
        3 FileHandle handle =Gdx.files.external("myfile.txt");//位于用户home目录,windows C:\User linux macos /user/<user>/myfile.txt
        4 FileHandle handle =Gdx.files.absolute("/some_dir/subdir/myfile.txt");//获取绝对路径的文件
      1. 检查文件存在、检查是否是目录:
      2. 1 boolean exists =Gdx.files.external("doitexist.txt").exists();
        2 boolean isDirectory =Gdx.files.external("test/").isDirectory();
        1. 列出文件目录也是非常简单
        2. 1 FileHandle[] files =Gdx.files.local("mylocaldir/").list();
          2 for(FileHandle file: files) {
          3 // do something interesting here
          4 }
          1. 我们还可以同过文件获取父文件或子文件的句柄  
          2. 1 FileHandle parent =Gdx.files.internal("data/graphics/myimage.png").parent();
            2 FileHandle child =Gdx.files.internal("data/sounds/").child("myaudiofile.mp3");
            1. 从文件中读取内容:
            1 FileHandle file =Gdx.files.internal("myfile.txt");
            2 String text = file.readString();
            3 //获取二进制数据
            4 FileHandle file =Gdx.files.internal("myblob.bin");
            5 byte[] bytes = file.readBytes();
              1. 写内容到文件中
              2. 1 FileHandle file =Gdx.files.local("myfile.txt"); 
                2 file.writeString("My god, it's full of stars", false);
                3 //二进制文件
                4 FileHandle file =Gdx.files.local("myblob.bin");
                5 file.writeBytes(newbyte[] { 20, 3, -2, 10 }, false);
                1. 删除、复制、重命名和移动文件/目录
                2. 1 FileHandle from =Gdx.files.internal("myresource.txt");
                  2 from.copyTo(Gdx.files.external("myexternalcopy.txt"));
                  3 Gdx.files.external("myexternalcopy.txt").rename("mycopy.txt");
                  4 Gdx.files.external("mycopy.txt").moveTo(Gdx.files.local("mylocalcopy.txt"));
                  5 Gdx.files.local("mylocalcopy.txt").delete();

                   

                  原文由博主 乐智 编辑撰写,版权归博主所有。

                  原文地址 http://www.dtblog.cn/1134.html 转载请注明出处!