What is the best way to find the user's home directory in Java?
Каков наилучший способ найти домашний каталог пользователя в Java?
Каков наилучший способ найти домашний каталог пользователя в Java?
Сложность в том, что решение должно быть кроссплатформенным; оно должно работать в Windows 2000, XP, Vista, OS X, Linux и других вариантах Unix. Я ищу фрагмент кода, который может выполнить это для всех платформ, и способ определения платформы.
Из-за ошибки Java 4787931, системное свойство user.home некорректно работает в Windows XP, поэтому использование этого системного свойства не является приемлемым решением, поскольку оно не является кроссплатформенным.
Переведено автоматически
Ответ 1
Ошибка, на которую вы ссылаетесь (bug 4787391), была исправлена в Java 8. Даже если вы используете более старую версию Java, System.getProperty("user.home") подход, вероятно, по-прежнему является лучшим. user.home Подход, похоже, работает в очень большом количестве случаев. 100% пуленепробиваемое решение в Windows сложно, потому что в Windows меняется представление о том, что означает домашний каталог.
Если user.home вам недостаточно, я бы посоветовал выбрать определение home directory для Windows и использовать его, получив соответствующую переменную окружения с помощью System.getenv(String).
Ответ 2
На самом деле с Java 8 правильный способ - использовать:
Шаги, используемые для определения домашнего каталога пользователя в Windows, изменены в соответствии с подходом, рекомендованным Microsoft. Это изменение может наблюдаться в более старых версиях Windows или там, где параметры реестра или переменные среды установлены для других каталогов. Природа несовместимости
behavioral RFE
6519127
Несмотря на то, что вопрос старый, я оставляю его для дальнейшего использования.
Концепция домашнего каталога кажется немного расплывчатой, когда речь заходит о Windows. Если переменных окружения (HOMEDRIVE / HOMEPATH /USERPROFILE) недостаточно, возможно, вам придется прибегнуть к использованию собственных функций через JNI или JNA. SHGetFolderPath позволяет извлекать специальные папки, такие как Мои документы (CSIDL_PERSONAL) или Локальные настройки\Данные приложения (CSIDL_LOCAL_APPDATA).