Вопрос-ответ

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 правильный способ - использовать:

System.getProperty("user.home");

Исправлена ошибка JDK-6519127, и в разделе "Несовместимости между JDK 8 и JDK 7" в примечаниях к выпуску говорится:


Область: Основные библиотеки / java.lang


Краткий обзор


Шаги, используемые для определения домашнего каталога пользователя в Windows, изменены в соответствии с подходом, рекомендованным Microsoft. Это изменение может наблюдаться в более старых версиях Windows или там, где параметры реестра или переменные среды установлены для других каталогов. Природа несовместимости


behavioral RFE

6519127

Несмотря на то, что вопрос старый, я оставляю его для дальнейшего использования.

Ответ 3
System.getProperty("user.home");

Смотрите JavaDoc.

Ответ 4

Концепция домашнего каталога кажется немного расплывчатой, когда речь заходит о Windows. Если переменных окружения (HOMEDRIVE / HOMEPATH /USERPROFILE) недостаточно, возможно, вам придется прибегнуть к использованию собственных функций через JNI или JNA. SHGetFolderPath позволяет извлекать специальные папки, такие как Мои документы (CSIDL_PERSONAL) или Локальные настройки\Данные приложения (CSIDL_LOCAL_APPDATA).

Пример кода JNA:

public class PrintAppDataDir {

public static void main(String[] args) {
if (com.sun.jna.Platform.isWindows()) {
HWND hwndOwner = null;
int nFolder = Shell32.CSIDL_LOCAL_APPDATA;
HANDLE hToken = null;
int dwFlags = Shell32.SHGFP_TYPE_CURRENT;
char[] pszPath = new char[Shell32.MAX_PATH];
int hResult = Shell32.INSTANCE.SHGetFolderPath(hwndOwner, nFolder,
hToken, dwFlags, pszPath);
if (Shell32.S_OK == hResult) {
String path = new String(pszPath);
int len = path.indexOf('\0');
path = path.substring(0, len);
System.out.println(path);
} else {
System.err.println("Error: " + hResult);
}
}
}

private static Map<String, Object> OPTIONS = new HashMap<String, Object>();
static {
OPTIONS.put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
OPTIONS.put(Library.OPTION_FUNCTION_MAPPER,
W32APIFunctionMapper.UNICODE);
}

static class HANDLE extends PointerType implements NativeMapped {
}

static class HWND extends HANDLE {
}

static interface Shell32 extends Library {

public static final int MAX_PATH = 260;
public static final int CSIDL_LOCAL_APPDATA = 0x001c;
public static final int SHGFP_TYPE_CURRENT = 0;
public static final int SHGFP_TYPE_DEFAULT = 1;
public static final int S_OK = 0;

static Shell32 INSTANCE = (Shell32) Native.loadLibrary("shell32",
Shell32.class, OPTIONS);

/**
* see http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
*
* HRESULT SHGetFolderPath( HWND hwndOwner, int nFolder, HANDLE hToken,
* DWORD dwFlags, LPTSTR pszPath);
*/

public int SHGetFolderPath(HWND hwndOwner, int nFolder, HANDLE hToken,
int dwFlags, char[] pszPath)
;

}

}
java