Java에서 getPath (), 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
객체 를 반환하는 File 해당 항목이 있습니다.
getPath()
returns the path used to create the File
object. This return value is not changed based on the location it is run (results below are for windows, separators are obviously different elsewhere)
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()
will resolve the path based on the execution location or drive. So if run from 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()
is system dependent. It will resolve the unique location the path represents. So if you have any "."s in the path they will typically be removed.
As to when to use them. It depends on what you are trying to achieve. getPath()
is useful for portability. getAbsolutePath()
is useful to find the file system location, and getCanonicalPath()
is particularly useful to check if two files are the same.
The big thing to get your head around is that the File
class tries to represent a view of what Sun like to call "hierarchical pathnames" (basically a path like c:/foo.txt
or /usr/muggins
). This is why you create files in terms of paths. The operations you are describing are all operations upon this "pathname".
getPath()
fetches the path that the File was created with (../foo.txt
)getAbsolutePath()
fetches the path that the File was created with, but includes information about the current directory if the path is relative (/usr/bobstuff/../foo.txt
)getCanonicalPath()
attempts to fetch a unique representation of the absolute path to the file. This eliminates indirection from ".." and "." references (/usr/foo.txt
).
Note I say attempts - in forming a Canonical Path, the VM can throw an IOException
. This usually occurs because it is performing some filesystem operations, any one of which could fail.
I find I rarely have need to use getCanonicalPath()
but, if given a File with a filename that is in DOS 8.3 format on Windows, such as the java.io.tmpdir
System property returns, then this method will return the "full" filename.
'Program Tip' 카테고리의 다른 글
주어진 인덱스에서 요소별로 목록 / 튜플을 정렬 (목록 / 튜플)하는 방법은 무엇입니까? (0) | 2020.10.03 |
---|---|
왜 this ()와 super ()가 생성자의 첫 번째 문장이어야합니까? (0) | 2020.10.03 |
git [duplicate]에서 단일 파일을 이전 버전으로 되돌리기 (0) | 2020.10.03 |
"(function () {…}) ()"과 같은 익명 함수에서 전체 Javascript 파일을 래핑하는 목적은 무엇입니까? (0) | 2020.10.03 |
Flexbox : 수평 및 수직 중앙 (0) | 2020.10.03 |