External Files: if you need to write big files, e.g. screenshots, or download files from the web, they could go on the external storage. Note that the external storage is volatile, a user can remove it or delete the files you wrote. Because they are not cleaned up and volatile, it is usually simpler to use local file storage.Checking Storage availability and paths
The different storage types might not be available depending on the platform your application runs on. You can query this kind of information via the Files module:boolean isExtAvailable = Gdx.files.isExternalStorageAvailable();boolean isLocAvailable = Gdx.files.isLocalStorageAvailable();
You can also query the root paths for external and local storage:String extRoot = Gdx.files.getExternalStoragePath();String locRoot = Gdx.files.getLocalStoragePath();
Obtaining FileHandles
FileHandle is obtained by using one of the aforementioned types directly from the Files module. The following code obtains a handle for the internal myfile.txt file.FileHandle handle = Gdx.files.internal("data/myfile.txt");
libGDX Setup application, this file will be contained in your Android project’s assets folder, $ANDROID_PROJECT/assets/data to be exact. Your desktop and html projects link to this folder in Eclipse, and will pick it up automatically when executed from within Eclipse.FileHandle handle = Gdx.files.classpath("myfile.txt");
The “myfile.txt” file is located in the directory where the compiled classes reside or the included jar files.FileHandle handle = Gdx.files.external("myfile.txt");
myfile.txt” needs to be in the users’ home directory (/home/<user>/myfile.txt on Linux, /Users/<user>/myfile.txt on OSX and C:\Users\<user>\myfile.txt on Windows) on desktop, and in the root of the SD card on Android.FileHandle handle = Gdx.files.absolute("/some_dir/subdir/myfile.txt");
/some_dir/subdir/ of the current drive on Windows or the exact path on linux, MacOS and Android.
FileHandle instances are passed to methods of classes they are responsible for reading and writing data. E.g. a FileHandle needs to be specified when loading an image via the Texture class, or when loading an audio file via the Audio module.Listing and Checking Properties of Files
Sometimes it is necessary to check for the existence of a specific file or list the contents of a directory. FileHandle provides methods to do just that in a concise way.
Here’s an example that checks whether a specific file exists and whether a file is actually a directory or not.boolean exists = Gdx.files.external("doitexist.txt").exists();boolean isDirectory = Gdx.files.external("test/").isDirectory();
Listing a directory is equally simple:FileHandle[] files = Gdx.files.local("mylocaldir/").list();for(FileHandle file: files) { // do something interesting here}
WARNING: If you don’t specify a folder the list will be empty.
Note: Listing of internal directories is not supported on Desktop.
We can also ask for the parent directory of a file or create a FileHandle for a file in a directory (aka “child”).FileHandle parent = Gdx.files.internal("data/graphics/myimage.png").parent();FileHandle child = Gdx.files.internal("data/sounds/").child("myaudiofile.mp3");
parent would point to "data/graphics/", child would point to data/sounds/myaudiofile.mp3".
There are many more methods in FileHandle that let you check for specific attributes of a file. Please refer to the Javadocs for detail.
Note: These functions are mostly unimplemented in the HTML5 back-end at the moment. Try not to rely on them too much if HTML5 will be a target of your application.Error Handling
RuntimeExceptions to signal errors instead of checked Exceptions. Our reasoning goes like this: 90% of the time we will access files that we know exist and are readable (e.g. internal files packaged with our application).Reading from a File
After obtaining a FileHandle, we can either pass it to a class that knows how to load content from the file (e.g. an image), or read it ourselves. The latter is done through any of the input methods in the FileHandle class. The following example illustrates how to load text from an internal file:FileHandle file = Gdx.files.internal("myfile.txt");String text = file.readString();
If you have binary data, you can easily load the file into a byte array:FileHandle file = Gdx.files.internal("myblob.bin");byte[] bytes = file.readBytes();
Javadocs for more information.Writing to a File
Similarly to reading files, FileHandle also provides methods to write to a file. Note that only the local, external and absolute file types support writing to a file. Writing a string to a file works as follows:FileHandle file = Gdx.files.local("myfile.txt");file.writeString("My god, it's full of stars", false);
FileHandle#writeString specifies if the content should be appended to the file. If set to false, the current content of the file will be overwritten.
One can of course also write binary data to a file:FileHandle file = Gdx.files.local("myblob.bin");file.writeBytes(new byte[] { 20, 3, -2, 10 }, false);
OutputStream. Again, refer to the Javadocs for details.Deleting, Copying, Renaming and Moving Files/Directories
These operations are again only possible for writable file types (local, external, absolute). Note however, that the source for a copying operation can also be a read only FileHandle. A few examples: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();
Note that source and target can be files or directories.
FileHandle Javadocs.