무엇의 차이입니다 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.txt
or 와 같은 경로)이라고 부르는 것에 대한 관점을 나타내려고한다는 것 /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
시스템 속성 반환)을 지정하면이 메서드는 “전체”파일 이름을 반환합니다.