Java에서 getPath(), getAbsolutePath() 및 getCanonicalPath()의 차이점은 무엇입니까?
차이가 있나요?getPath()
,getAbsolutePath()
, , , , 입니다.getCanonicalPath()
★★★★★★★★★★★★★★★★★?
그리고 각각은 언제 사용하나요?
다음의 파일명을 고려해 주세요.
C:\temp\file.txt
경로, - 아, 아, 아, 아, 아, 아, 아, 아이다.
.\file.txt
- 이 경로입니다절대 경로도 아니고 표준 경로도 아닙니다.
C:\temp\myapp\bin\..\\..\file.txt
길입니다. - 이 길은 절대적인 길입니다.이건 정식 경로가 아니야
표준 경로는 항상 절대 경로입니다.
경로에서 표준 경로로 변환하면 절대 경로로 변환됩니다(일반적으로 현재 작업 디렉토리에서 고정됨). ./file.txt
becomes가 되다c:/temp/file.txt
"정리"하고, "정리", "정리"하고, "정리"하고, "정리"를..\
(유닉스 상의) 심볼링크 해결.
또한 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
제가 발견한 가장 좋은 방법은 다음과 같은 것들을 시험해 보는 것입니다.
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
so,는,getPath()
는 File 오브젝트를 이 오브젝트는 상대적일 도 있고 않을 수도 .File은 상대적일 수도 있습니다.이 객체는 상대적일 수도 있고 그렇지 않을 수도 있습니다.getAbsolutePath()
파일에 절대 를 제공합니다.또, 「파일의 절대 경로」를 .getCanonicalPath()
는 파일에 대한 고유한 절대 경로를 제공합니다.동일한 파일을 가리키는 절대 경로는 매우 많지만 표준 경로는 하나뿐입니다.
각각언 ?제 용? ??? 두 개가 두 , 두 개로 나누어야 합니다.Files
디스크상의 같은 파일을 가리키고 있기 때문에, 그 표준 패스를 비교할 수 있습니다.아, 아, 아, 아, 아, 아, 아, 아, 아, 아.
요컨대:
getPath()
스트링의 을 가져옵니다.File
오브젝트는 로 구성되었으며 상대적인 현재 디렉토리일 수 있습니다.getAbsolutePath()
상대적인 경우 현재 디렉토리에 대해 경로 문자열을 해결한 후 경로 문자열을 가져오므로 완전 수식 경로가 됩니다.getCanonicalPath()
해, 상대 「」, 「」, 「」, 「」)을 모두 합니다..
★★★★★★★★★★★★★★★★★」..
파일 시스템이 가리키는 파일 시스템 개체를 참조하기 위한 표준 수단이라고 간주하는 경로를 반환하는 파일 시스템 링크) 및 모든 파일 시스템 링크.
각 에는, 하는 「파일」의 「의 대응이 .File
★★★★★★ 。
IMO, Java는 "절대" 경로 구현을 잘못했습니다. 절대 경로에서 상대 경로 요소를 제거해야 합니다.그런 다음 표준 형식은 경로 내의 FS 링크 또는 접합을 삭제합니다.
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()
는, 2개의 하는 경우에 합니다.
해야 할 은 '아주머니'가 '아주머니'라는 입니다.File
이름으로 Sun의 '계층 경로 이름'과 같은 의하려고 합니다.c:/foo.txt
★★★★★★★★★★★★★★★★★」/usr/muggins
이 때문에, 패스의 관점에서 파일을 작성합니다.설명하는 작업은 모두 이 "경로 이름"에 대한 작업입니다.
getPath()
를 가져옵니다( 「」 「」 「」 。../foo.txt
)getAbsolutePath()
인 경우 됩니다( 「 」 、 「 」 。/usr/bobstuff/../foo.txt
)getCanonicalPath()
는 파일에 대한 절대 경로의 고유한 표현을 가져오려고 합니다.이것에 의해, 「..」및 「」의 참조로부터의 간접은 불필요하게 됩니다(/usr/foo.txt
를 참조해 주세요.
주의: 표준 경로를 형성할 때 VM은 다음 명령을 실행할 수 있습니다.IOException
이 문제는 보통 파일 시스템 조작을 몇 가지 수행하고 있기 때문에 발생합니다.이 중 하나가 실패할 수 있습니다.
거의 것을 되었다.getCanonicalPath()
Windows 로 8을 가지는 되어 있는 는, Windows 의 「DOS 8.3」입니다.java.io.tmpdir
시스템 속성이 반환되면 이 메서드는 "full" 파일 이름을 반환합니다.
언급URL : https://stackoverflow.com/questions/1099300/whats-the-difference-between-getpath-getabsolutepath-and-getcanonicalpath
'programing' 카테고리의 다른 글
가입은 게으른 사람들을 위한 건가요? (0) | 2022.07.27 |
---|---|
nginx가 있는 vue: 경로가 일치하지 않습니다. (0) | 2022.07.27 |
스탠포드 튜토리얼과 GCC의 경합 (0) | 2022.07.27 |
사이트 로드 시 nuxtServerInit이 여러 번 호출되는 이유 (0) | 2022.07.27 |
변환 커밋 콜이 실패하는 이유는 무엇입니까? (0) | 2022.07.27 |