Сложность в том, что он должен быть кроссплатформенным. Windows 2000, XP, Vista, OSX, Linux, другие варианты Unix. Я ищу фрагмент кода, который может выполнить это для всех платформ, и способ обнаружить платформу.
Теперь вы должны знать об ошибке 4787931 , user.home
которая не работает должным образом, поэтому, пожалуйста, не предоставляйте мне ответы в учебниках, я сам могу найти их в руководствах.
java
cross-platform
home-directory
Бруно Раншарт
источник
источник
Ответы:
Ошибка, на которую вы ссылаетесь (ошибка 4787391), была исправлена в Java 8. Даже если вы используете более старую версию Java, этот
System.getProperty("user.home")
подход, вероятно, все еще остается лучшим.user.home
Подход , кажется, работает в очень большом количестве случаев. На 100% пуленепробиваемое решение для Windows сложно, потому что Windows имеет смещенное представление о том, что означает домашний каталог.Если вам
user.home
это не подходит, я бы предложил выбрать определениеhome directory
для окон и использовать его, получив соответствующую переменную окружения с помощьюSystem.getenv(String)
.источник
На самом деле с Java 8 правильный путь заключается в использовании:
Ошибка JDK-6519127 была исправлена, и в разделе «Несовместимости между JDK 8 и JDK 7» примечаний к выпуску говорится:
Несмотря на то, что вопрос старый, я оставляю это для дальнейшего использования.
источник
Смотрите JavaDoc .
источник
Концепция каталога HOME кажется немного расплывчатой, когда дело доходит до Windows. Если переменных среды (HOMEDRIVE / HOMEPATH / USERPROFILE) недостаточно, вам, возможно, придется прибегнуть к использованию встроенных функций через JNI или JNA . SHGetFolderPath позволяет вам извлекать специальные папки, такие как Мои документы (CSIDL_PERSONAL) или Локальные настройки \ Данные приложения (CSIDL_LOCAL_APPDATA).
Пример кода JNA:
источник
Другие ответили на вопрос передо мной, но полезная программа для распечатки всех доступных свойств:
источник
Когда я искал версию Scala, все, что я мог найти, это код JD McDowell выше. Я включил свой порт Scala здесь, так как там в настоящее время нет более подходящего.
Как и в случае с версией Java, вам потребуется добавить собственный доступ к Java , включая оба jar-файла, в указанные библиотеки.
Приятно видеть, что JNA теперь делает это намного проще, чем когда был опубликован оригинальный код.
источник
Я бы использовал алгоритм, подробно описанный в отчете об ошибках, используя System.getenv (String), и отступил бы до использования свойства user.dir, если ни одна из переменных среды не указала действительный существующий каталог. Это должно работать кроссплатформенно.
Я думаю, что под Windows, что вам действительно нужно, так это пользовательский каталог документов.
источник
Альтернативой было бы использовать Apache CommonsIO
FileUtils.getUserDirectory()
вместоSystem.getProperty("user.home")
. Это даст вам тот же результат, и нет никакой возможности ввести опечатку при указании системного свойства.Существует большая вероятность, что в вашем проекте уже есть библиотека Apache CommonsIO. Не вводите его, если вы планируете использовать его только для получения домашнего каталога пользователя.
источник
Если вы хотите что-то, что хорошо работает в Windows, есть пакет WinFoldersJava, который оборачивает собственный вызов для получения «специальных» каталогов в Windows. Мы часто используем его, и он работает хорошо.
источник