Поиск
Меню
Категории раздела
Рекомендуем
|
Работа с файламиLibgdx приложения работают на различных платформах: Desktop системах (Windows, Linux, Mac OS X), Android и на JavaScript/WebGL возможных браузерах. Каждая из этих платформ работает с файлами немного по разному. Libgdx Files (код) модуль предоставляет следующие возможности:
Прежде чем мы сможет погрузиться в аспекты Libgdx, мы должны сначала рассмотреть различные понятия файловых систем для всех поддерживаемых платформ. Файловые системы платформЗдесь мы рассмотрим обзор парадигм файловых систем платформ поддерживаемых Libgdx. Desktop (Windows, Linux, Mac OS X)На Desktop ОС, файловая система является одним большим куском памяти. Файлы могут бы доступны по относительному пути к рабочей директории (директории в которой запущено приложение) или абсолютному пути. При этом игнорируются права доступа, файлы и директории всегда доступны на чтение и запись для всех приложений. AndroidНа Android ситуация немного сложнее. Файлы можно хранить внутри APK приложения либо как ресурсы или asset. Эти файлы доступны только для чтения. Libgdx использует только asset механизм, так как он предоставляет прямой доступ к байтовым потокам и более напоминает традиционную файловую систему. Ресурсы отлично предоставляются для обычных Android приложений, но вызывают проблемы при использовании в играх. Android совершает манипуляции во время их загрузки, например он автоматически изменяет размер. Asset хранятся в Файлы также могут храниться во внутренней памяти, где они доступны для чтения и записи. Каждое установленное приложение имеет специальную выделенную внутреннею директорию для хранения. Эта директории тоже доступна только для этого приложения. Вы можете думать о таком хранилище как о частном рабочем пространстве приложения. Наконец, файлы можно хранить на внешнем накопителе данных, таком как SD карта. Внешние накопители не всегда могут быть доступны, например пользователь может вытащить SD карту. Файлы в этом месте хранения следует считать не всегда доступными. Чтобы иметь возможность записи на внешние накопители, вам нужно будет добавить разрешения в AndroidManifest.xml файл, смотрите разрешения ниже. iOSНа iOS доступны все типы файлов. Javascript/WebGLОбычное Javascript/WebGL приложение не имеет традиционной концепции файловой системы. Вместо этого, assets подобны изображениям ссылающимся на URL адреса, которые указывают на конкретные фалы одного и нескольких серверов. Современные браузеры поддерживают локальное хранилище данных, которое приближается к традиционным файловым системам с чтением и записью. Libgdx предоставляет абстракцию файловой системы, доступной только для чтения. Типы (хранения) файловФайл в libgdx представлен экземпляром FileHandle класса. FileHandle имеет тип, который определяет где находится файл. Следующая таблица иллюстрирует наличие и местоположение каждого типа файла для каждой платформы.
Абсолютные и classpath файлы в основном используются для таких инструментов, как редакторы на Desktop, которые имеют более сложные требования файлового ввода/вывода. Для игр их можно спокойно игнорировать. Порядок, в котором вы должны использовать типы файлов выглядит следующим образом:
Проверка наличия хранилища и путейРазличные типы хранилищ могут быть недоступны в зависимости от платформы на которой запущено приложение. Вы можете запросить такую информацию через Files модуль: boolean isExtAvailable = Gdx.files.isExternalStorageAvailable(); Можно также запросить корневой путь для внешнего и локального хранилища: String extRoot = Gdx.files.getExternalStoragePath(); Получение дескриптора файла (FileHandles)Получение FileHandle handle = Gdx.files.internal("data/myfile.txt"); Если вы использовали Setup UI, то этот файл будет содержаться в asset директории Android проекта, если точно то в FileHandle handle = Gdx.files.classpath("myfile.txt"); Файл «Myfile.txt» находится в каталоге, там же где скомпилированные классы или включенные jar файлы. FileHandle handle = Gdx.files.external("myfile.txt"); В этом случае необходимо чтобы myfile.txt файл был в домашней директории пользователя ( FileHandle handle = Gdx.files.absolute("/some_dir/subdir/myfile.txt"); В случае абсолютного дескриптора файла, файл должен быть именно там, куда указывает путь. В /некоторая_директория/поддиректория/ текущего диска в Windows или точный путь для Linux, Mac OS и Android. Экземпляры FileHandle передаются методам соответствующих классов отвечающих за чтение и запись данных. Например нужно указать FileHandle для загрузки изображение с помощью Texture класса или для загрузки аудио файла с помощью Audio модуля. Список файлов и проверка свойствИногда необходимо проверить конкретный файл на его наличие или просмотреть содержимое директории. FileHandle предоставляет методы чтобы сделать этот в простой форме. Вот пример, который проверяет существование конкретного файла и проверяет фактически является ли он директорией или нет: boolean exists = Gdx.files.external("doitexist.txt").exists(); Просмотр списка директории столь же прост: FileHandle[] files = Gdx.files.local("mylocaldir/").list(); Примечание: просмотр списка внутренних каталогов не поддерживается на Desktop. Можно также запросить родительскую директорию файла или создать FileHandle для файла в родительской директории. FileHandle parent = Gdx.files.internal("data/graphics/myimage.png").parent();
В FileHandle есть множество методов позволяющих проверять определенных атрибуты файла. Пожалуйста, для деталей обратитесь к Javadoc. Примечание: На текущий момент функции в основном нереализованными на HTML5 back-end. Постарайтесь не полагаться на них, если целевым приложением будет HTML5. Обработка ошибокНекоторые операции с дескрипторами файлов могут быть неудачными. Для сигнала об ошибки применяются Чтение из файлаПосле получения FileHandle, мы можем либо передать его в класс, который знает как загружать содержимое из файла (например изображение) или читать его самим. Последнее делается через любой из методов ввода в FileHandle классе. В следующем примере показано, как загрузить текст из внутреннего файла: FileHandle file = Gdx.files.internal("myfile.txt"); Если у вас есть двоичные данные, вы можете легко загрузить файл в байтовый массив: FileHandle file = Gdx.files.internal("myblob.bin"); Класс FileHandle имеет гораздо больше методов чтения. Смотрите дополнительные сведения в Javadoc. Запись в файлКак и для чтения файлов, FileHandle предоставляет методы для записи в файл. Заметьте, что только локальные, внешние и абсолютные типы файлов поддерживаются для записи в файл. Запись строки в файл работает следующим образом: FileHandle file = Gdx.files.local("myfile.txt"); Второй параметр метода Можно, конечно и записывать двоичных данных в файл: FileHandle file = Gdx.files.local("myblob.bin"); Есть много других методов в FileHandle, которые облегчают запись различными способами, например использование OutputStream. Смотрите дополнительные сведения в Javadoc. Удаление, копирование, переименование и перемещение файлов/директорийЭти операции возможны только для типов файлов доступных для записи (локальных, внешних и абсолютных). Однако заметьте, что источником операции копирования может быть FileHandle доступный только для чтения. Несколько примеров: FileHandle from = Gdx.files.internal("myresource.txt"); Обратите внимание, что источником и приемником могут быть файлы или директории. Более подробную информацию о доступных методах смотрите в FileHandle Javadoc. |