Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Технически правильная кроссплатформенная организация хранения пользовательских файлов в Java-приложениях

#java #spring #кроссплатформенность


Как Вы знаете, в Windows файлы пользователя для большинства приложений хранятся в
AppData/Roaming. У меня почти не опыта работы с MacOS и Linux, но думаю, там есть аналогичные
папки.

Это относится не только к разработке Java-приложений, но полагаю, что как только
мы запускаем приложение, первым делом оно должно проверять AppData/Roaming на наличие
там своей подпапки и если её нет - создавать её. 

Вопрос такой: есть ли что-нибудь получше, чем приведённый ниже алгоритм?


Узнаём ОС
Получаем в зависимости от ОС путь к папке пользовательскими настройками (AppData/Roaming
в случае Windows)
Проверяем, если ли подпапка конкретно того приложения которое мы разрабатываем. Если
есть - проверяем, есть ли права доступа к ней. Если нет - создаём.
Работаем с файлами подпапки.


Может быть, есть какая-нибудь подходящая библиотека от Spring? 
    


Ответы

Ответ 1



В моем случае приложение пишет в подпапку Tomcat aplication server поскольку оно одно. Алгоритм аналогичен вашему. private static final String NIX_ROOT_FOLDER = "/opt/tomcat"; private static final String WIN_ROOT_FOLDER = "C:\\Users\\%username%\\AppData\\Roaming\\tomcat"; private static final String OS_NAME = System.getProperty("os.name").toLowerCase(); public static final String ROOT_FOLDER = OS_NAME.contains("win") ? WIN_ROOT_FOLDER : NIX_ROOT_FOLDER; Ничего плохого в таком алгоритме не вижу. В общем случае имеет смысл писать в одну из следующих папок: В папку приложения (только до передеплоя) В папку пользователя В папку сервера приложений Если планируется дальнейшая обработка этих файлов в других приложениях, то: В какую-либо выделенную папку на локальной машине В сетевую папку Spring, на сколько я знаю дает только обертку для стандартных джавовских алгоритмов работы с файлами..

Ответ 2



Расскажу про мой тяжелый случай... Искренне надеюсь что это вам никогда не пригодится По специфике работы приходится иметь дело с МСВС 5 (мобильная система вооруженных сил), это такой RedHat linux на ядре 2.6, в ней помимо всего прочего реализована мандатное управление доступом. Так вот, в таком окружении директория, в которую приложению позволено записывать файлы определяется именем пользователя, от которого запущен процесс и текущим уровнем доступа (особой важности/сов. секретно/секретно/не секретно), соответственно выглядит это примерно так: /home/%username%/.tmp/0-0/ не секретно /home/%username%/.tmp/1-0/ секретно /home/%username%/.tmp/2-0/ сов. секретно /home/%username%/.tmp/3-0/ особой важности Хорошим тоном в данном случае считается что приложение, никуда кроме как в папку пользователя не пишет, однако это возможно. А для того чтобы получить уровень доступа в Java естественно никаких средств нет, и тут у вас либо JNI либо JNA или Runtime.exec(), при помощи которых нужно выяснить метку секретности процесса Отвечая на Ваш вопрос: по сути это ваш алгоритм, только с перламутровыми пуговицами... ADD: так как топикстартер принял ответ, который может ввести людей а заблуждение, добавлю в свой ответ В общем случае веб приложение не должно писать в папку, принадлежащую контейнеру сервлетов. Во-первых это сложно поддерживать при масштабировании на несколько контейнеров, во вторых таким образом вы можете повлиять на целостность других приложений в этом контейнере. В третьих, при правильной организации установки по, томкат это один пакет а ваше приложение - другой, с вашим сценарием будет намного сложнее создать корректные скрипты для инсталляции деинсталляции. Это навскидку, то с чем реально сталкивался...

Комментариев нет:

Отправить комментарий