Ответ 1
Разница в том, что существует только один канонический путь к файлу [1] в то время как в файле может быть много абсолютных путей (в зависимости от системы). Например, в системе Unix /usr/local/../bin
совпадает с /usr/bin
. getCanonicalPath()
устраняет эти неоднозначности и возвращает (уникальный) канонический путь. Поэтому, если текущий каталог был /usr/local
, то:
File file = new File("../bin");
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
будет печатать:
../бен
/usr/local/../bin
/USR/бен
В предположении Voo: в Unix-системах getCanonicalPath()
также разрешит символические ссылки, если существует символическая ссылка. Жесткие ссылки обрабатываются как обычные файлы (в основном это то, что они есть). Обратите внимание, однако, что для этих методов не требуется файл.
[1] Ну, не совсем. Как отмечает @Tom Hale в комментарии, если файловая система поддерживает жесткие связанные каталоги, может быть несколько канонических путей к данному файлу.