[java] Java에서 경로 결합

에서 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/testdata/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


답변