Java에서 getPath (), getAbsolutePath () 및 getCanonicalPath ()의 차이점은 무엇입니까? getAbsolutePath()그리고 getCanonicalPath()자바? 그리고 언제 사용합니까?

무엇의 차이입니다 getPath(), getAbsolutePath()그리고 getCanonicalPath()자바?

그리고 언제 사용합니까?



답변

다음 파일 이름을 고려하십시오.

C:\temp\file.txt -경로, 절대 경로 및 표준 경로입니다.

.\file.txt-경로입니다. 절대 경로도 아니고 표준 경로도 아닙니다.

C:\temp\myapp\bin\..\\..\file.txt-이것은 경로와 절대 경로입니다. 정식 경로가 아닙니다.

정식 경로는 항상 절대 경로입니다.

경로를 표준 경로로 변환하면 경로가 절대적입니다 (일반적으로 현재 작업 디렉토리에 ./file.txt고정됨 c:/temp/file.txt). 파일의 표준 경로는 경로를 “정제”하여 ..\심볼릭 링크와 같은 것을 제거하고 해결합니다 (유닉스에서).

nio.Paths를 사용하여 다음 예제를 참고하십시오.

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

답변

이런 것들에 대한 느낌을 얻는 가장 좋은 방법은 시도해 보는 것입니다.

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파일이 디스크의 동일한 파일을 가리키는 지 확인하려는 경우 표준 경로를 비교할 수 있습니다. 한 가지 예만 있습니다.


답변

한마디로 :

  • getPath()File객체가 구성된 경로 문자열을 가져 오며 상대적인 현재 디렉토리 일 수 있습니다.
  • getAbsolutePath() 상대 경로 인 경우 현재 디렉토리에 대해 경로 문자열을 확인한 후 경로 문자열을 가져 와서 완전한 경로를 만듭니다.
  • getCanonicalPath()현재 디렉토리에 대한 상대 경로를 확인한 후 경로 문자열을 가져오고 상대 경로 ( ...)를 제거 하고 파일 시스템 링크는 파일 시스템 링크가 가리키는 경로를 반환하기 위해 경로를 반환합니다.

또한 이들 각각에는 해당 File객체 를 반환하는 파일과 동등한 파일이 있습니다 .


답변

getPath()File객체 를 만드는 데 사용 된 경로를 반환 합니다. 이 반환 값은 실행되는 위치에 따라 변경되지 않습니다 (아래 결과는 창에 대한 것이고 구분 기호는 다른 곳에서는 분명히 다릅니다)

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()데 유용하며 두 파일이 동일한 지 확인하는 데 특히 유용합니다.


답변

가장 큰 장점은 File클래스가 Sun이 “계층 경로 이름”(기본적으로 c:/foo.txtor 와 같은 경로)이라고 부르는 것에 대한 관점을 나타내려고한다는 것 /usr/muggins입니다. 이것이 경로 측면에서 파일을 작성하는 이유입니다. 설명하는 작업은이 “경로 이름”에 대한 모든 작업입니다.

  • getPath()( ../foo.txt)로 파일이 작성된 경로를 가져옵니다.
  • getAbsolutePath()File이 작성된 경로를 가져 오지만 경로가 상대적인 경우 현재 디렉토리에 대한 정보를 포함합니다 ( /usr/bobstuff/../foo.txt)
  • getCanonicalPath() 파일에 대한 절대 경로의 고유 한 표현을 가져 오려고 시도 합니다. 이렇게하면 “..”및 “.”에서 간접적으로 제거됩니다. 참고 문헌 ( /usr/foo.txt).

참고 내가 정식 경로를 형성 하려고 시도 하면 VM이을 던질 수 있습니다 IOException. 일반적으로 일부 파일 시스템 작업을 수행하기 때문에 발생하며 그 중 하나가 실패 할 수 있습니다.


답변

거의 사용하지 않아도 getCanonicalPath()되지만 Windows에서 DOS 8.3 형식의 파일 이름을 가진 파일 (예 : java.io.tmpdir시스템 속성 반환)을 지정하면이 메서드는 “전체”파일 이름을 반환합니다.