2012-04-15 17 views

Respuesta

20

fragmento más corto del código que puedo pensar es en este :

URI uri = new URI("http://www.stackoverflow.com/path/to/something"); 

URI parent = uri.getPath().endsWith("/") ? uri.resolve("..") : uri.resolve(".") 
+1

URI.resolve también es ideal para operaciones más complejas ... como uri.resolve ("dir/archivo.txt") – David

+0

Esto no parece funcionar para URI con el protocolo "jar: file: ...", que ocurre con recursos que se encuentran en archivos JAR. –

3

No sé de la función de biblioteca para hacer esto en un solo paso. Sin embargo, la siguiente (la verdad es engorroso) poco de código Creo que logra lo que busca (y que podría terminar con esto en su propia función de utilidad):

import java.io.File; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class URLTest 
{ 
    public static void main(String[] args) throws MalformedURLException 
    { 
     // make a test url 
     URL url = new URL("http://stackoverflow.com/questions/10159186/how-to-get-parent-url-in-java"); 

     // represent the path portion of the URL as a file 
     File file = new File(url.getPath()); 

     // get the parent of the file 
     String parentPath = file.getParent(); 

     // construct a new url with the parent path 
     URL parentUrl = new URL(url.getProtocol(), url.getHost(), url.getPort(), parentPath); 

     System.out.println("Child: " + url); 
     System.out.println("Parent: " + parentUrl); 
    } 
} 
+2

En Windows, esto presenta barras diagonales inversas. – Sogartar

0

Aquí es una solución muy sencilla que era el mejor enfoque en mi caso de uso:

private String getParent(String resourcePath) { 
    int index = resourcePath.lastIndexOf('/'); 
    if (index > 0) { 
     return resourcePath.substring(0, index); 
    } 
    return "/"; 
} 

creé función simple, que se inspiró en el código de File::getParent. En mi código no hay problema con las barras diagonales inversas en Windows. Supongo que resourcePath es parte del recurso de URL, sin protocolo, dominio y número de puerto. (por ejemplo, /articles/sport/atricle_nr_1234)

Cuestiones relacionadas