2009-06-22 7 views
16

Java가 프로그램이 현재 실행중인 플랫폼과 상관없이 주어진 경로가 절대 경로인지 여부를 확인하기 위해 어쨌든 존재합니까? 다음의 예와 같이 그럼, 내가 원하는 것은 아마 뭔가 : Linux에서Java : OS와 관계없이 경로가 절대인지 확인하는 방법

: Windows에서

new File("/home/").isAbsolute() // Should return true. 
new File("C:/My Documents").isAbsolute() // Should *also* return true. 

:

new File("C:/Documents").isAbsolute() // Should return true. 
new File("/home/").isAbsolute() // Should *also* return true. 

아마 코드 뭔가이 주위에 얻을,하지만 난 할 수 있습니다 이 문제를 해결하기 위해 Java에서 제공되는 내장 클래스를 알고 있는지 알아 내야합니다. 아니면 누구도이 문제를 겪었습니까? 어떻게 해결 했습니까?

감사합니다.

+1

, "C :/내 문서"와 같은 경로는 아마도 무효이며, 그것은 확실히 절대 아니다. posix 표준을 구현하는 시스템에서는 모든 경로가 단일 '루트'아래에 있으므로 절대 경로가 해당 루트에서 시작됩니다. 따라서 절대 경로는 항상 "/"로 시작합니다. 그 밖의 것은 그 프로세스의 현재 작업 디렉토리와 관련된 것으로 간주됩니다. 리눅스에서 "C :/..."는 현 작업 디렉토리에서 "C :"라는 디렉토리를 의미하는 것으로 간주됩니다. – SingleNegationElimination

+1

귀하의 질문에 약간의 의미가 있습니다. 모든 경로가 절대적인 가상 운영 체제를 상상해보십시오. 이 운영체제에 자바가 있다고 가정 해 봅시다. 따라서 요구 사항을 충족 시키려면 프로그램이 현재 실행중인 플랫폼에 관계없이 항상 true를 반환하는 isFileAbsolute() 메서드가 필요합니다. 구현하기 쉽지만 의미는 없습니다. –

+0

사용자가 원격 컴퓨터에서 작업 디렉터리를 구성하는 경우가 있습니다. 원격 컴퓨터는 Unix 또는 Windows를 실행할 수 있습니다 (가장 일반적인 시나리오는 로컬 컴퓨터가 Windows이고 원격 컴퓨터가 유닉스 임). 사용자 지정 경로의 유효성을 검사해야하며 경로가 절대적인지 여부를 확인해야합니다. –

답변

10

아니요.

이 몇 가지 기본 FileSystem 클래스 (즉 자바 7,하지만 그들은뿐만 아니라 그 이전에 존재) isAbsolute을 (노출이),하지만 그들은 공개하지 않은 - 그래서 당신은 경우에도이를 사용하고, 안 당신은 당신의 코드가 리플렉션 쓰레기로 가득 차게 될 것입니다 - 단지 "올바른"OS 만이 JRE에 포함되므로 어쨌든 그들 주위에 코드를 작성해야합니다.

다음은 시작하기위한 isAbsolute (...)의 Java 7 구현입니다. File.getPrefixLength()는 package-private입니다.

Win32FileSystem :

public boolean isAbsolute(File f) 
{ 
     int pl = f.getPrefixLength(); 
     return (((pl == 2) && (f.getPath().charAt(0) == slash)) 
       || (pl == 3)); 
} 

UnixFileSystem :이 (자바 6)를 사용하여 결국

public boolean isAbsolute(File f) 
{ 
     return (f.getPrefixLength() != 0); 
} 
+9

6 년 후에,이 답변은 구식입니다. 요즘 File 클래스에는 "[isAbsolute()] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#isAbsolute) 메소드가 포함되어 있습니다. d expect : _ "이 추상 경로 이름이 절대 경로인지 여부를 테스트합니다 절대 경로 이름의 정의는 시스템에 따라 다릅니다 UNIX 시스템에서는 접두사가"/ "인 경우 절대 경로입니다 Microsoft Windows 시스템에서 경로 이름은 접두어 "\\"또는 그 접두사가 "\\\\"인 드라이브 지정자 _ – Guus

-1

:

private static boolean testPath(String path) { 
    int prefixLen = FilenameUtils.getPrefixLength(path); 
    if (testPathWin(path, prefixLen) || testPathLinux(prefixLen)) 
     return true; 
    else 
     return false; 
} 

private static boolean testPathWin(String path, int prefixLen) { 
    if (prefixLen == 3) 
     return true; 
    File f = new File(path); 
    if ((prefixLen == 2) && (f.getPath().charAt(0) == '/')) 
     return true; 
    return false; 
} 

private static boolean testPathLinux(int prefixLen) { 
    return (prefixLen != 0); 
} 
+0

Java 7 구현을 복사 한 경우 public boolean isAbsolute (File f) Windows의 경우 파일 공유를 사용하지만 FilenameUtils.getPrefixLength() 메소드 . Java 7 구현 및 getPrefixLength()의 Apache 구현은 동일하지 않습니다. UNC 경로의 경우 apache는 "\\ foo \ poo"-> "\\ foo \"를 접두사로 사용하고 길이는 6 – acheron55

+0

@Accheron55가됩니다. "isAbsolute()"를 참조하십니까? 정확히 소스 스 니펫에 어디에 있습니까? – stuhpa

+0

check t 그는 FilenameUtils.getPrefixLength (경로)의 소스 코드입니다. UNC 경로의 길이는 임의의 수를 반환 할 수 있습니다. 그러나 testPathWin 메소드에서 길이 2 또는 3 만 검사합니다. 그렇게 잘못되었습니다. 자바 구현을 사용할 수 있다면 사실 일 것이다. 0,1,2,3 값만 반환하기 때문입니다. 또한 다음과 같은 라인이 있습니다 :'if (testPathWin (path, prefixLen) || testPathLinux (prefixLen))'linux check은 훨씬 더 넓은 범위를 가지고 있기 때문에 윈도우 메소드를 쓸모 없게 만듭니다. 윈도우 경로의 길이가 1이라고 가정 해 봅시다. 그러나 testPath 메소드는 여전히 true를 반환합니다. 이는 false입니다. – acheron55

3

이 사용하는 아파치 FilenameUtil에서 내 균열 -

public static boolean isAbsolute(final String path) { 
     return FilenameUtils.getPrefixLength(path) != 0; 
    } 

기술적으로 이것은 상대방을 반환합니다. 내 목적에는 어느 것이 좋습니다. 자바 7에서

8

: 리눅스에서

new File(path).isAbsolute()