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

What's the difference between getPath(), getAbsolutePath(), and getCanonicalPath() in Java?

В чем разница между getPath(), getAbsolutePath() и getCanonicalPath() в Java?

В чем разница между getPath(), getAbsolutePath() и getCanonicalPath() в Java?

И когда я использую каждый из них?

Переведено автоматически
Ответ 1

Рассмотрим эти имена файлов:

C:\temp\file.txt - Это путь, абсолютный путь и канонический путь.

.\file.txt - Это путь. Это не абсолютный и не канонический путь.

C:\temp\myapp\bin\..\\..\file.txt - Это путь и абсолютный путь. Это не канонический путь.

Канонический путь - это всегда абсолютный путь.

Преобразование из пути в канонический путь делает его абсолютным (обычно привязывается к текущему рабочему каталогу , например, ./file.txt становится c:/temp/file.txt). Канонический путь к файлу просто "очищает" путь, удаляя и разрешая такие вещи, как ..\ и разрешая символические ссылки (в unix).

Также обратите внимание на следующий пример с nio.Пути:

String canonical_path_string = "C:\\Windows\\System32\\";
String absolute_path_string = "C:\\Windows\\System32\\drivers\\..\\";

System.out.println(Paths.get(canonical_path_string).getParent());
System.out.println(Paths.get(absolute_path_string).getParent());

Хотя оба пути ссылаются на одно и то же местоположение, результат будет совершенно разным:

C:\Windows
C:\Windows\System32\drivers
Ответ 2

Лучший способ, который я нашел, чтобы разобраться в подобных вещах, - это попробовать их:

import java.io.File;
public class PathTesting {
public static void main(String [] args) {
File f = new File("test/.././file.txt");
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
try {
System.out.println(f.getCanonicalPath());
}
catch(Exception e) {}
}
}

Ваш результат будет примерно таким:

test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt

Итак, getPath() дает вам путь на основе объекта File, который может быть относительным, а может и не быть; getAbsolutePath() дает вам абсолютный путь к файлу; и getCanonicalPath() дает вам уникальный абсолютный путь к файлу. Обратите внимание, что существует огромное количество абсолютных путей, которые указывают на один и тот же файл, но только один канонический путь.

Когда использовать каждый из них? Зависит от того, чего вы пытаетесь достичь, но если вы пытались увидеть, указывают ли два Files на один и тот же файл на диске, вы могли бы сравнить их канонические пути. Только один пример.

Ответ 3

Короче говоря:


  • getPath() возвращает строку пути, с помощью которой был создан File объект, и это может быть относительный текущий каталог.

  • getAbsolutePath() получает строку пути после преобразования ее в текущий каталог, если он относительный, в результате чего получается полный путь.

  • getCanonicalPath() получает строку пути после разрешения любого относительного пути относительно текущего каталога и удаляет любые относительные пути (. и ..) и любые ссылки файловой системы, чтобы вернуть путь, который файловая система считает каноническим средством ссылки на объект файловой системы, на который он указывает.

Кроме того, каждый из них имеет эквивалент файла, который возвращает соответствующий File объект.

Обратите внимание, что IMO, Java неправильно реализовала "абсолютный" путь; на самом деле это должно удалить любые относительные элементы пути в абсолютном пути. Каноническая форма затем удалит любые ссылки FS или пересечения в пути.

Ответ 4

getPath() возвращает путь, использованный для создания File объекта. Это возвращаемое значение не изменяется в зависимости от местоположения, в котором он выполняется (результаты ниже приведены для Windows, разделители, очевидно, в других местах другие)

File f1 = new File("/some/path");
String path = f1.getPath(); // will return "\some\path"

File dir = new File("/basedir");
File f2 = new File(dir, "/some/path");
path = f2.getPath(); // will return "\basedir\some\path"

File f3 = new File("./some/path");
path = f3.getPath(); // will return ".\some\path"

getAbsolutePath() путь будет определен в зависимости от места выполнения или диска. Итак, если запустить из c:\test:

path = f1.getAbsolutePath(); // will return "c:\some\path"
path = f2.getAbsolutePath(); // will return "c:\basedir\some\path"
path = f3.getAbsolutePath(); // will return "c:\test\.\basedir\some\path"

getCanonicalPath() зависит от системы. Это определит уникальное местоположение, которое представляет путь. Поэтому, если у вас есть какие-либо "." ы в пути, они обычно удаляются.

Относительно того, когда их использовать. Это зависит от того, чего вы пытаетесь достичь. getPath() полезно для переносимости. getAbsolutePath() полезно для определения местоположения файловой системы, и getCanonicalPath() особенно полезно для проверки, совпадают ли два файла.

java