2012-07-15 12 views
10

Windows'ta bir Scala uygulaması geliştiriyorum ve bir dosyaya bir HTML yoluna bir yol eklemem gerekiyor. Dosya ve yollarla çalışmak için Java'nın io ve nio kullanıyorum. Uygulama Windows üzerinde çalışır çünkü - - ama yol bir HTML şablonuna eklenecek olduğundan, ileriye doğru yerine / eğik içermelidirJava'nın File.toString veya Path.toString belirli bir yol ayırıcısına sahip

/* 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) 

sorun relativeIncludesPath.toString çıkış ters eğik çizgi ayırıcı olarak \ içermesidir.

Dokümanlarda file/path.toStringUsingSeparator('/') gibi bir şey bulamadığım için, şu anda kendimi şu anda oldukça rahatsız edici bulduğum relativeIncludesPath.toString.replace('\\', '/') ile yardımcı oluyorum.

Soru: Gerçekten değiştirmek yerine daha iyi bir yolu yok mu?

Ayrıca, Java'nın URI ile denedim, ancak relativize, incomplete.

+0

Belki bir şeyleri özlüyorum. Neden yolu göreceli hale getiremiyorsunuz ve sonra 'toString()' yerine 'toURI()' işlevini kullanamıyorsunuz? – Gene

+0

Bunu denedim, ancak sonra buna benzeyen mutlak bir URI aldım: '' dosya:/C:/root/dir/foo/inc/''. –

+0

"URI" ifadesini kullandığınız için teşekkür ederiz.Çözebileceğinin farkında değildim ve bunun benim için mükemmel olduğu ortaya çıkıyor. –

cevap

4

(en az OpenJDK implementation cinsinden) bir dize olarak yol içten Yol arayüzü mağazaları, Windows uygulama ve basitçe toString() çağrıldığında bu gösterimi döndürür. Bu, hiçbir hesaplama yapılmadığı ve herhangi bir yol ayırıcıyı "yapılandırmak" için bir şans olmadığı anlamına gelir.

Bu nedenle, çözümünüzün sorunu çözmek için şu anda en iyi seçenek olduğu sonucuna varıyorum.

0

Java'daki sistem özelliklerinin çoğunu alabilirsiniz. Bu bağlantıyı bir göz atın:

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

Bunu istiyorsun:

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

Ayırıcıyı alabileceğimi biliyorum ve yanılmasam bile global olarak ayarlayabilirim. Ancak, tek bir işlem veya tek bir File/Path nesnesi için belirli bir ayırıcı seçmenin bir yolunu arıyorum. –

1

Bu soruna yeni girdim. Göreceli bir yolunuz varsa, Path öğesinin bir Iterable<Path> öğesinin, isteğe bağlı bir başlangıç ​​kök öğesinin ardından kullanılması gerçeği kullanabilir ve parçaları eğik çizgi ile birleştirebilirsiniz. Ne yazık ki kök eleman eğik çizgi içerebilir, ör. Windows'da, c:\ ve \\foo\bar\ (UNC yolları için) gibi kök elemanlar elde edersiniz, bu yüzden hala eğik çizgi ile değiştirmeniz gereken şey ne olursa olsun. Ama ...

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();   
} 

böyle bir şey yapabileceğini ve bu kod ile test ettiğinde:

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"); 
} 

Ben bu olsun:

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 

metinsel ikamesi eğik çizgi ile ters eğik çizgi kesinlikle daha kolay, ama bazı şeytani kenar durum kırıp kırmayacağı konusunda hiçbir fikrim yok. (Unix yollarında ters eğik çizgi olabilir mi?)

İlgili konular