2012-07-15 5 views
10

Windows에서 Scala 응용 프로그램을 개발 중이며 파일 경로를 HTML 템플릿에 삽입해야합니다. Java의 ionio을 사용하여 파일 및 경로를 처리합니다. 응용 프로그램이 Windows에서 실행되기 때문에 - -하지만 경로가 HTML 템플릿에 삽입되기 때문에, 앞으로 대신 / 슬래시 있어야합니다특정 경로 구분 기호가있는 Java의 File.toString 또는 Path.toString

/* The paths actually come from the environment. */ 
val includesPath = Paths.get("foo\\inc") 
val destinationPath = Paths.get("bar\\dest") 

/* relativeIncludesPath.toString == "..\\foo\\inc", as expected */ 
val relativeIncludesPath = destinationPath.relativize(includesPath) 

문제는 relativeIncludesPath.toString의 출력이 백 슬래시 구분 기호로 \이 포함되어 있다는 것입니다.

문서에서 file/path.toStringUsingSeparator('/')과 같은 것을 찾지 못했기 때문에 현재는 호의적이 아닌 relativeIncludesPath.toString.replace('\\', '/')으로 자신을 돕고 있습니다.

질문 : 바꾸기를 사용하는 것보다 실제로 더 좋은 방법이 있습니까?

또한 Java의 URI으로 실험했지만 relativizeincomplete입니다.

+0

아마도 나는 뭔가를 놓치고 있습니다. 왜 경로를 상대화하지 않고 toString()을 사용하는 대신에'toURI()'를 사용할 수 없습니까? – Gene

+0

나는 그것을 시도했지만 다음과 같이 보이는 절대 URI를 얻는다 :''file :/C :/root/dir/foo/inc /''. –

+0

'URI'에 대해 언급 해 주셔서 감사합니다.나는 그것이 '해결할 수있다'는 것을 깨닫지 못했고, 그것이 나를 위해 완벽하다는 것을 알게되었습니다. –

답변

4

(적어도 OpenJDK implementation에서) 문자열로 경로 내부 경로 인터페이스 매장의 윈도우 구현하고 간단하게 toString()이 호출되면 해당 표현을 반환합니다. 이것은 계산이 필요 없으며 경로 분리자를 "구성"할 기회가 없다는 것을 의미합니다.

이러한 이유로, 귀하의 솔루션은 현재 귀하의 문제를 해결하기위한 최선의 방법이라고 결론 내리고 있습니다.

0

Java에서 대부분의 시스템 등록 정보를 가져올 수 있습니다. 이 링크에서보세요 :

http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

당신이 원하는 :

Key: "file.separator" 
Meaning: Character that separates components of a file path. This is "/" on UNIX and "\" on Windows. 

String sep = System.getProperty("path.separator"); 
+0

필자는 분리 기호를 얻을 수 있음을 알고 있으며, 내가 잘못하지 않는다면 전역으로 설정할 수도 있습니다. 그러나 단일 작업 또는 단일 파일/경로 개체에 대한 특정 구분 기호를 선택하는 방법을 찾고 있습니다. –

1

방금이 문제가 발생했습니다. 상대 경로가있는 경우 Path이 요소 중 Iterable<Path>이고 선택적인 초기 루트 요소 다음에 오는 사실을 사용할 수 있으며 조각을 직접 슬래시로 연결할 수 있습니다. 불행히도 루트 요소는 슬래시를 포함 할 수 있습니다. Windows에서 c:\\\foo\bar\ (UNC 경로 용)과 같은 루트 요소를 얻으므로 앞으로 슬래시로 대체해야하는 것과 상관없는 것처럼 보입니다. 하지만 당신은 는 ...

static public String pathToPortableString(Path p) 
{ 
    StringBuilder sb = new StringBuilder(); 
    boolean first = true; 
    Path root = p.getRoot(); 
    if (root != null) 
    { 
     sb.append(root.toString().replace('\\','/')); 
     /* root elements appear to contain their 
     * own ending separator, so we don't set "first" to false 
     */    
    } 
    for (Path element : p) 
    { 
     if (first) 
      first = false; 
     else 
      sb.append("/"); 
     sb.append(element.toString()); 
    } 
    return sb.toString();   
} 

을 같은 것을 할 수 있고 나는이 코드를 테스트 할 때 :

static public void doit(String rawpath) 
{ 
    File f = new File(rawpath); 
    Path p = f.toPath(); 
    System.out.println("Path: "+p.toString()); 
    System.out.println("  "+pathToPortableString(p)); 
} 

static public void main(String[] args) { 
    doit("\\\\quux\\foo\\bar\\baz.pdf"); 
    doit("c:\\foo\\bar\\baz.pdf"); 
    doit("\\foo\\bar\\baz.pdf"); 
    doit("foo\\bar\\baz.pdf"); 
    doit("bar\\baz.pdf"); 
    doit("bar\\"); 
    doit("bar"); 
} 

난이 얻을 :

Path: \\quux\foo\bar\baz.pdf 
     //quux/foo/bar/baz.pdf 
Path: c:\foo\bar\baz.pdf 
     c:/foo/bar/baz.pdf 
Path: \foo\bar\baz.pdf 
     /foo/bar/baz.pdf 
Path: foo\bar\baz.pdf 
     foo/bar/baz.pdf 
Path: bar\baz.pdf 
     bar/baz.pdf 
Path: bar 
     bar 
Path: bar 
     bar 

의 텍스트 대체 앞으로 슬래시를 사용하는 백 슬래시는 분명 더 쉬울 수 있지만 일부 뚜렷한 문제를 해결할 수 있는지 여부는 알 수 없습니다. (유닉스 경로에 백 슬래시가있을 수 있습니까?)