Статьи

Разница между getPath (), getCanonicalPath () и getAbsolutePath () файла в Java

Файловый API очень важен в Java, поскольку предоставляет доступ файловой системы к программам Java. Несмотря на то, что файловый API Java богат, есть много тонкостей, которые нужно знать, когда вы их используете. Один из распространенных запросов программиста о пути к файлу — это разница между getPath() , getCanonicalPath() и getAbsolutePath() , почему существует три метода для получения пути к файлу и что происходит, если вы вызываете getPath () вместо getCanonicalPath () ,

Кстати, прежде чем понимать разницу между getPath (), getAbsolutePath () и getCanonicalPath (), давайте разберемся в концепции этих методов, то есть разнице между путем, абсолютным путем и каноническим путем . В общем, путь — это способ получить доступ к определенному файлу или каталогу в файловой системе, он может быть абсолютным (также известным как полный путь) или относительным, например, относительно текущего местоположения.

Абсолютный путь определяет путь от корня файловой системы, например, C: \\ или D: \\ в Windows и из / в операционных системах на основе UNIX, например, Linux или Solaris . Канонический путь немного хитрый, потому что все канонические пути абсолютны, а наоборот не верны . Фактически он определяет уникальный абсолютный путь к файлу из корня файловой системы. Например, C: //temp/names.txt — это канонический путь к names.txt в Windows, а /home/javinpaul/test/names.txt — это канонический путь в Linux. С другой стороны, может быть много абсолютных путей к одному и тому же файлу, включая только что увиденный канонический путь. Например, другой абсолютный путь к тому же файлу в Windows может быть C: //temp/./names.txt; аналогично в UNIX / home / javinpaul / test /./ names.txt есть еще один абсолютный путь к тому же файлу. Таким образом, вы можете сказать, что абсолютный путь может содержать метасимволы, такие как. и .. для представления текущего и родительского каталога. В оставшейся части этой статьи мы узнаем разницу между getPath (), getAbsolutePath () и getCanonical () Path, взглянув на значения, которые он возвращает для определенного файла.

Что такое абсолютный, относительный и канонический путь

Вы часто слышите термин «абсолютный, канонический и относительный путь» при работе с файлами в UNIX, Windows, Linux или любой файловой системе. Это три распространенных способа ссылки на любой конкретный файл в скрипте или программе. Если вы программист, пишущий сценарий, то вы знаете, как использование абсолютного пути может сделать ваш сценарий жестким и негибким, а использование абсолютного пути — бесславно известным как жестко заданный путь в сценарии — одна из плохих практик кодирования в словаре программиста. , Абсолютный путь — это полный путь к определенному файлу, например C: \ temp \ abc.txt. Определение абсолютного пути также зависит от системы. В системах UNIX путь является абсолютным, если его префикс — «/». В системах Win32 путь является абсолютным, если его префикс является спецификатором диска, за которым следует «\\», или если его префикс «\\».

Например, у нас есть две директории: temp и temp1, а файл test.txt находится в директории temp.

1
C:\temp
1
C:\temp1

В Java под Windows вы можете иметь следующие возможные абсолютные пути, которые ссылаются на один и тот же файл test.txt.

1
C:\temp\test.txt
1
2
3
4
C:\temp\test.txt
C:\temp\TEST.TXT
C:\temp\.\test.txt
C:\temp1\..\temp\test.txt

С другой стороны, относительный путь относительно каталога, в котором вы находитесь, называется текущим каталогом. Поэтому, если вы находитесь в указанном выше каталоге, то если вы ссылаетесь на файл test.txt как относительный, он подразумевает тот же каталог, в котором вы находитесь. Когда вы делаете ../, тогда он возвращается к одному каталогу, также известному как родительский каталог. Канонические пути немного сложнее. Для начала все канонические пути являются абсолютными (но не все абсолютные пути являются каноническими). Один файл, существующий в системе, может иметь много разных путей к нему, но только один канонический путь. Canonical дает уникальный абсолютный путь для данного файла. Детали того, как это достигается, вероятно, зависят от системы. Для приведенного выше примера у нас есть один и только один канонический путь: C: \ temp \ test.txt. Помните, что в Java вы можете использовать косую черту в стиле UNIX (/), используя разделитель пути, или даже разделитель пути операционной системы, используя файл. системное свойство разделителя, ключ для написания действительно независимого от платформы Java-приложения .

Разница между getPath (), getAbsolutePath () и getCanonicalPath () в Java

Абсолютный или Относительный путь Java Как только вы поймете разницу между абсолютным, каноническим и относительным путями , будет очень легко провести различие между этими тремя методами, потому что они фактически возвращают путь, абсолютный и канонический путь. Короче, вот ключевое отличие между ними:

  1. Первый метод, getPath (), возвращает строку, которая обозначает путь, используемый для создания связанного объекта File, и он может быть относительно текущего каталога.
  2. Второй метод, getAbsolutePath (), возвращает строку пути после разрешения ее относительно текущего каталога, если он относительный, в результате чего получается полный путь.
  3. Третий метод, getCanonicalPath (), возвращает строку пути после разрешения любого относительного пути к текущему каталогу и удаляет любой элемент относительного пути, например (. И ..), а также любые ссылки на файловую систему, чтобы вернуть путь, который файловая система считает каноническим означает ссылку на объект файловой системы, на который он указывает.

Также помните, что каждый из двух вышеупомянутых методов имеет эквивалент File, который возвращает соответствующий объект File, например, getAbsoluteFile () и getCanonicalFile (), который возвращает то же самое.

getPath () против getAbsolutePath () против getCanonicalPath ()

В следующем примере показано, как может быть много разных путей (и абсолютных путей) к одному и тому же файлу, которые имеют одинаковый канонический путь. Таким образом, канонический путь полезен, если вы хотите знать, указывают ли два разных пути на один и тот же файл или нет.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.io.File;
 
/**
 * Java program to show difference between path, absolute path and canonical
 * path related to files in Java. File API provides three methods to
 * java.io.File class getPath(), getAbsolutePath() and getCanonicalPath() and
 * this program just explain what those method returns.
 *
 * @author Javin Paul
 */
public class PathDemo {
 
    public static void main(String args[]) {
        System.out.println("Path of the given file :");
        File child = new File(".././Java.txt");
        displayPath(child);
 
        File parent = child.getParentFile();
        System.out.println("Path of the parent file :");
        displayPath(parent);
    }
 
    public static void displayPath(File testFile) {
        System.out.println("path : " + testFile.getPath());
        System.out.println("absolute path : " + testFile.getAbsolutePath());
 
        try {
            System.out.println("canonical path : " + testFile.getCanonicalPath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}
 
Output:
Path of the given file :
path : ..\.\Java.txt
absolute path : C:\Users\WINDOWS 8\workspace\Demo\..\.\Java.txt
canonical path : C:\Users\WINDOWS 8\workspace\Java.txt
 
Path of the parent file :
path : ..\.
absolute path : C:\Users\WINDOWS 8\workspace\Demo\..\.
canonical path : C:\Users\WINDOWS 8\workspace

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