Java에서 getPath (), getAbsolutePath () 및 getCanonicalPath ()의 차이점은 무엇입니까?


583

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

그리고 언제 사용합니까?


Path.toAbsolutePath().normalize()정식 (실제) 경로와 절대 경로 사이의 좋은 중간 지점을 잊지 마십시오 .
eckes

답변:


625

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

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

11
FWIW, C:\temp\file.txt표준 경로는 아닙니다. temp 디렉토리는 파일 시스템 소프트 링크 또는 하드 링크 (NTFS의 정션) 일 수 있고 file.txt는 소프트 링크 일 수 있습니다. 파일 시스템이 파일에 대한 하드 링크를 구별 할 수 있는지 모르겠습니다.
Lawrence Dol

1
path는 실제로 이러한 문제 나 구성 요소의 존재를 고려하지 않으며 구문 만 고려합니다.
escape-llc

정규화 된 경로와 달리 표준 경로는 파일 시스템에 충돌합니다.
eckes 2016 년

1
기본적으로 나는 getAbsolutePath()대신 대신 사용해야하는 이유를 볼 수 없습니다 getCanonicalPath(). 표준 ../부품이 자동으로 해당 부품을 해결하기 때문에 더 좋아 보입니다 .
Scadge

이것이 고려 사항이라면 잠시 동안 getCanonicalPath던지지 않는다는 것을 잊지 마십시오 . IOExceptiongetAbsolutePath
버려진 카트

129

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

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


7
자바가 "절대적인"경로를 잘못 구현했다고 주장 할 수있다. 절대 경로에서 상대 경로 요소를 제거해야합니다. 표준 형식은 경로의 모든 FS 링크 또는 접합을 제거합니다.
Lawrence Dol

but if you were trying to see if two Files are pointing at the same file on disk어떻게? 예를 들어주세요?
Asif Mushtaq

@ 알 수없는 : 당신은 그것에 대한 정식 경로를 사용합니다.
Lawrence Dol

67

한마디로 :

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

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


36

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


이것에 대한 예를 들어 주시겠습니까? getCanonicalPath() is particularly useful to check if two files are the same.
Asif Mushtaq

20

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

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

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


3

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.