Ответ 1
Простой path = path.replaceFirst("^~",System.getProperty("user.home"));
, когда он получен от пользователя (перед тем как сделать из него File
), должно быть достаточно, чтобы работать в большинстве случаев.
Я пишу простую утилиту Java командной строки. Я хотел бы, чтобы пользователь мог передать путь к файлу относительно своего домашнего каталога с помощью оператора ~
. Так что-то вроде ~/Documents/...
Мой вопрос в том, есть ли способ заставить Java разрешить этот тип пути автоматически? Или мне нужно проверить путь к файлу для оператора ~
?
Кажется, что этот тип функциональности следует испечь в объекте File
. Но, похоже, это не так.
Простой path = path.replaceFirst("^~",System.getProperty("user.home"));
, когда он получен от пользователя (перед тем как сделать из него File
), должно быть достаточно, чтобы работать в большинстве случаев.
Это расширение, специфичное для оболочки, поэтому вам нужно заменить его в начале строки, если присутствует:
String path = "~/xyz";
...
if (path.startsWith("~" + File.separator)) {
path = System.getProperty("user.home") + path.substring(1);
}
File f = new File(path);
...
Как указал Эдвин Бак в комментарии к другому ответу, ~ otheruser/Documents также должен корректно расширяться. Здесь функция, которая работала для меня:
public String expandPath(String path) {
try {
String command = "ls -d " + path;
Process shellExec = Runtime.getRuntime().exec(
new String[]{"bash", "-c", command});
BufferedReader reader = new BufferedReader(
new InputStreamReader(shellExec.getInputStream()));
String expandedPath = reader.readLine();
// Only return a new value if expansion worked.
// We're reading from stdin. If there was a problem, it was written
// to stderr and our result will be null.
if (expandedPath != null) {
path = expandedPath;
}
} catch (java.io.IOException ex) {
// Just consider it unexpandable and return original path.
}
return path;
}
Довольно обтекаемый ответ, который работает с путями с фактическими ~ символами в них:
String path = "~/Documents";
path.replaceFirst("^~", System.getProperty("user.home"));