чтение / запись в файлы, чтобы он работал как в среде Linux / Windows - PullRequest
2 голосов
/ 06 января 2010

Если кто-то устанавливает мое java-приложение на свой компьютер (windows / linux / mac), как я могу убедиться, что мои приложения могут читать и записывать файлы, которые работают во всех средах.

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

Примечание: эти файлы, которые читаются / записываются, являются файлами приложений, то есть не пытаются ссылаться на какой-либо файл / реестр операционной системы.

Таким образом, все файлы могут находиться в корневой папке приложений (где бы они ни были установлены)

Ответы [ 5 ]

3 голосов
/ 06 января 2010

Использование файла java.io.File (или, возможно, пакета java.nio). Как правило, это будет работать кроссплатформенно, но вы должны знать о различиях платформ и кода вокруг них. Например, вам нужно использовать такие вещи, как File.pathSeparator, чтобы убедиться, что вы используете правильный разделитель пути для платформы. Кроме того, в зависимости от того, что вы делаете, есть различия между тем, как работает блокировка и т. Д., И не все операции гарантированно работают - некоторые просто молча терпят неудачу.

1 голос
/ 06 января 2010

Вам необходимо установить свойство, например, с помощью «-Dapphome = abx» в командной строке или в каком-либо файле конфигурации. В первом случае вы можете получить его с помощью System.getProperty («apphome»), во втором, к сожалению, вам все же нужно найти способ найти этот файл конфигурации.

Если это поможет, вы можете найти домашний каталог пользователя с помощью System.getProperty ("user.home"). Это может быть очень полезно, поскольку вы можете читать файлы конфигурации для каждого пользователя, используя его в качестве отправной точки. Обычные файлы для нескольких пользователей должны будут куда-то входить в систему, например, /etc/appname/config.properties или C: \

Кстати, вы должны использовать System.getProperty ("java.io.tmpdir") для ваших временных файлов. Не загромождайте каталог, в котором было запущено ваше приложение (если можете - возможно, у вас нет необходимых разрешений!), Или домашний каталог пользователя. Вы должны быть осторожны - создайте подкаталог для своего приложения и, возможно, подкаталог для каждого пользователя, чтобы избежать риска того, что одно приложение наступит на временные файлы, используемые вторым приложением.

1 голос
/ 06 января 2010

Библиотека файлового ввода-вывода Java не зависит от платформы и должна работать на любой ОС, на которой установлена ​​jvm. При этом некоторые файловые системы ведут себя по-разному (права доступа, пользователь / группа и т. Д.), Что может привести к успешному выполнению ваших файловых операций на одной платформе, но не на другой. По этой причине всегда полезно проверить код на всех системах, на которых вы хотите, чтобы ваша система работала.

0 голосов
/ 06 января 2010

Класс Java File принимает "/" в качестве разделителей пути, так что просто используйте это. Если вам нужны корневые диски, не кодируйте C: или что-нибудь, а спрашивайте JRE о корнях и используйте их.

0 голосов
/ 06 января 2010

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

Вы можете прочитать системное свойство user.dir, чтобы узнать путь, по которому приложение было запущено в . Обратите внимание, что user.dir является свойством только для чтения, то есть вы не можете изменить «текущий каталог», установив свойство user.dir. Вы читаете системные свойства с помощью метода System.getProperty(String). Это не то же самое, что «установлен в», но это может работать. Но это слабовато.

Если вы действительно хотите указать местоположение установочного каталога, либо вынудите пользователя установить переменную среды (MYAPP_HOME), либо просканируйте всю файловую систему. Лично мне не нравятся эти варианты.

На самом деле, и если данные относятся к конкретному пользователю, на мой взгляд, лучшим выбором будет чтение / запись данных в домашнем каталоге пользователя (используйте системное свойство user.home, чтобы получить их), например, что-то вроде ~/.yourapp (пользователи Windows никогда не заходят в свои %USER_HOME% в любом случае) или, что еще лучше, в каталог, следующий за Freedesktop Базовая директория XDG (очевидно, об этом будут заботиться только пользователи Linux).

Затем, для чтения / записи, просто используйте java.io.File, который является кросс-платформенным при правильном использовании (например, используйте File.separator, если вам нужно построить путь, не используйте жестко закодированную версию имени- сепаратор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...