Java - кроссплатформенный путь к файлу - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь разработать кроссплатформенное приложение, которое работает на рабочем столе и Android, а также с использованием JavaFX и Gluon.

Во время выполнения мой код создает сериализованный файл в моей папке ресурсов. Мне также нужно читать и записывать сериализованные данные с / на него.

Мне удалось работать на настольном компьютере, но не на android. Потому что у него другая файловая структура, я думаю. Вот почему я пытаюсь получить путь к файлу динамически.

Существующие файлы ресурсов, созданные до выполнения (и не измененные), похоже, работают нормально на обеих платформах.

Я пробовал с new File("src/main/resources/folder/file.ser").getAbsolutePath(); и пытаясь получить к нему доступ из моей папки root следующим образом: getClass.getResources("/folder/file.ser").getPath();. Оба они отлично работают на рабочем столе (Windows), но, к сожалению, Android не находит файл по пути к файлу.

Другая проблема может заключаться в том, что мне не следует создавать файлы времени выполнения в папке ресурсов, а затем где я должен?

Есть идеи, как я могу читать и записывать файлы, созданные во время выполнения, которые работают как на android, так и на рабочем столе?

(Если информации недостаточно, чтобы помочь мне Я пытаюсь воспроизвести мой код в минимальной форме и предоставить дополнительную информацию.)

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Файлы ресурсов с путем к пути к классам могут быть упакованы в jar-файл и должны рассматриваться как доступные только для чтения, особенно если в некоторых случаях ресурсы могут кэшироваться. Они не File. Они могут быть захвачены по URL, URI, пути. Пути чувствительны к регистру, а разделитель пути - /.

Следовательно, ресурсы могут использоваться только в качестве шаблона, исходного файла. Они должны быть скопированы в настоящий файл вне приложения.

Path path = Paths.get(System.getProperty("user.home"), ".myapp/file.ser");
Files.createDirectories(path.getParent());
if (Files.exists(path)) {
    URL url = MyClass.class.getResource("/folder/file.ser");
    Path template = Paths.get(url.toURI());

    Files.copy(template, path);
}

Кроме того, .ser, сериализованный объект java, не является хорошей идеей. Я бы предложил XML, используя JAXB с аннотациями. Более читаемый, поддерживаемый, проверяемый. Не указывается sh между разработкой JRE у вас и развертыванием JRE на клиенте.

2 голосов
/ 10 января 2020

Я думаю, что вы на совершенно неверном пути. Создание или запись в файлы в папке ресурсов вообще не работает. Идея состоит в том, что файлы в папке ресурсов упаковываются в файлы JAR или иным образом связаны с приложением и недоступны для записи во время выполнения.

Что вам нужно сделать, это создать папку приложения, когда ваша программа запускается для первый раз. Обычной практикой на рабочем столе является, например, создание невидимой папки «.myApp» в домашнем каталоге пользователя. На других платформах, таких как Android, существуют другие правила именования и определения местоположения c, но концепция та же. При первом запуске вы также можете скопировать необходимые ресурсы из папки ресурсов в эту папку приложения, чтобы редактировать их во время выполнения.

...