에서 Python
나는 두 개의 경로를 가입 할 수 있습니다os.path.join
같이 .
os.path.join("foo", "bar") # => "foo/bar"
나는이 경우 걱정하지 않고, 자바에서 동일한을 실현하려 노력하고 OS
있다 Unix
, Solaris
또는 Windows
:
public static void main(String[] args) {
Path currentRelativePath = Paths.get("");
String current_dir = currentRelativePath.toAbsolutePath().toString();
String filename = "data/foo.txt";
Path filepath = currentRelativePath.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
}
나는이 기다리고 있었다 Path.resolve( )
나의 현재 디렉토리에 가입 할 /home/user/test
로 data/foo.txt
만들기 /home/user/test/data/foo.txt
. 내가 뭘 잘못하고 있니?
답변
empty String
작품을 사용하여 현재 디렉토리를 얻는 원래 솔루션이지만 . 그러나 user.dir
현재 디렉터리와 user.home
홈 디렉터리에 대해 속성 을 사용하는 것이 좋습니다 .
Path currentPath = Paths.get(System.getProperty("user.dir"));
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt");
System.out.println(filePath.toString());
산출:
/Users/user/coding/data/foo.txt
Java Path 클래스 문서에서 :
경로가 인 하나의 이름 요소로만 구성된 경우 빈 경로로 간주됩니다
empty
.empty path is equivalent to accessing the default directory
파일 시스템을 사용하여 파일에 액세스합니다 .
Paths.get("").toAbsolutePath()
작동하는 이유
에 빈 문자열이 전달 Paths.get("")
되면 반환 된 Path
객체에 빈 경로가 포함됩니다. 그러나를 호출 Path.toAbsolutePath()
하면 경로 길이가 0보다 큰지 확인하고, 그렇지 않으면 user.dir
시스템 속성을 사용 하고 현재 경로를 반환합니다.
다음은 Unix 파일 시스템 구현을위한 코드입니다. UnixPath.toAbsolutePath ()
기본적으로 Path
현재 디렉터리 경로를 확인한 후에 는 인스턴스를 다시 만들어야합니다 .
또한 File.separatorChar
플랫폼 독립적 인 코드를 사용 하는 것이 좋습니다 .
Path currentRelativePath = Paths.get("");
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it.
String filename = "data" + File.separatorChar + "foo.txt";
Path filepath = currentDir.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
산출:
/Users/user/coding/data/foo.txt
답변
Paths#get(String first, String... more)
주,
경로 문자열 또는 결합 될 때 경로 문자열을 형성하는 문자열 시퀀스를
Path
.…
first가 빈 문자열이고 more가 비어 있지 않은 문자열을 포함하지 않는 경우 빈 경로를
Path
나타내는 A 가 반환됩니다.
현재 사용자 디렉토리를 얻으려면 간단히 System.getProperty("user.dir")
.
Path path = Paths.get(System.getProperty("user.dir"), "abc.txt");
System.out.println(path);
또한 get
메소드는 후속 경로 문자열을 제공하는 데 사용되는 의 가변 길이 인수 를 String
사용합니다. 그래서, 만들 Path
를 위해 /test/inside/abc.txt
당신은 다음과 같은 방법을 사용해야합니다,
Path path = Paths.get("/test", "inside", "abc.txt");
답변
특정 방법이 아닙니다.
Java 8 이상을 사용하는 경우 두 가지 옵션이 있습니다.
a) java.util.StringJoiner 사용
StringJoiner joiner = new StringJoiner(File.pathSeparator); //Separator
joiner.add("path1").add("path2");
String joinedString = joiner.toString();
b) 사용 String.join(File.pathSeparator, "path1", "path2");
Java 7 이하를 사용하는 경우 apache commons의 commons-lang 라이브러리를 사용할 수 있습니다. StringUtils 클래스에는 구분 기호를 사용하여 문자열을 결합하는 메서드가 있습니다.
씨) StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);
참고 : Windows에 대해 Linux 경로 구분자 “/”를 사용할 수 있습니다 (절대 경로는 “/ C : / mydir1 / mydir2″와 같은 것임을 기억하십시오. 항상 “/”을 사용하는 것은 file : //과 같은 프로토콜을 사용하는 경우 매우 유용합니다.
답변
가장 기본적인 방법은 다음과 같습니다.
Path filepath = Paths.get("foo", "bar");
작성해서는 안됩니다 Paths.get("")
. 나는 그것이 전혀 효과가 없다는 것에 놀랐다. 현재 디렉토리를 명시 적으로 참조하려면을 사용하십시오 Paths.get(System.getProperty("user.dir"))
. 사용자의 홈 디렉토리를 원하면 Paths.get(System.getProperty("user.home"))
.
접근 방식을 결합 할 수도 있습니다.
Path filepath = Paths.get(
System.getProperty("user.home"), "data", "foo.txt");
답변
Java에서 경로를 결합하는 가장 안정적이고 플랫폼 독립적 인 방법 Path::resolve
은를 사용하는 것입니다 ( Paths::get
. 경로의 일부를 나타내는 임의 길이의 문자열 배열의 경우 Java 스트림을 사용하여 결합 할 수 있습니다.
private static final String[] pieces = {
System.getProperty("user.dir"),
"data",
"foo.txt"};
public static void main (String[] args) {
Path dest = Arrays.stream(pieces).reduce(
/* identity */ Paths.get(""),
/* accumulator */ Path::resolve,
/* combiner */ Path::resolve);
System.out.println(dest);
}
답변
당신은 좋아할 수 있습니다
// /root
Path rootPath = Paths.get("/root");
// /root/temp
Path temPath = rootPath.resolve("temp");
자세한 내용은 여기에 있습니다. Path Sample Usecase