2008-12-31 5 views

Respuesta

2

No está seguro de cualquier método exacto que le dará lo que quiere, pero esto debe conseguir que cierre:

import static org.junit.Assert.assertEquals; 

import java.net.URL; 

import org.junit.Test; 

public class UrlTest { 

    @Test 
    public void testUrl() throws Exception { 
     URL jarUrl = new URL("jar:file:/C:/proj/parser/jar/parser.jar!/test.xml"); 
     assertEquals("jar", jarUrl.getProtocol()); 
     assertEquals("file:/C:/proj/parser/jar/parser.jar!/test.xml", jarUrl.getFile()); 
     URL fileUrl = new URL(jarUrl.getFile()); 
     assertEquals("file", fileUrl.getProtocol()); 
     assertEquals("/C:/proj/parser/jar/parser.jar!/test.xml", fileUrl.getFile()); 
     String[] parts = fileUrl.getFile().split("!"); 
     assertEquals("/C:/proj/parser/jar/parser.jar", parts[0]); 
    } 
} 

Espero que esto ayude.

+0

Muy cerca, pero el uso de split() es demasiado análisis de bajo nivel para mí. La implementación de la URL de Sun no parece proporcionar métodos para lidiar con esta extraña sintaxis de jarfile.jar! Path/to/specific/file para las extrañas URL jar de Sun. todo el shebang (juego de palabras intencionado) es devuelto por getPath(). Pero JarURLConnection, como mencionó starblue, parece funcionar, aunque solo a través de la apertura del contenedor. – skiphoppy

27

Esto podría hacerlo, si MS-Windows no se ofende por una barra inicial:

final URL jarUrl = 
     new URL("jar:file:/C:/proj/parser/jar/parser.jar!/test.xml"); 
    final JarURLConnection connection = 
     (JarURLConnection) jarUrl.openConnection(); 
    final URL url = connection.getJarFileURL(); 

    System.out.println(url.getFile()); 
+0

Voy con exactamente esta solución, aunque me gustaría que hubiera una forma de hacerlo sin abrir el contenedor (o analizar directamente, por supuesto); parece que la URL necesita entender esto raro! sintaxis, o si no, debe existir una subclase que lo entienda. – skiphoppy

+6

(En Java7) JarURLConnection no abre el archivo JAR cuando ejecuta el código anterior. Simplemente analiza la URL en su nombre. – Gili

+1

¡Debería ser la respuesta aceptada! –

1

Algunos podrían considerar que esto sea un poco 'hacky', sino que va a hacer el trabajo en esa instancia y estoy seguro de que funcionaría mucho mejor que crear todos esos objetos en las otras sugerencias.

String jarUrl = "jar:file:/C:/proj/parser/jar/parser.jar!/test.xml"; 

jarUrl = jarUrl.substring(jarUrl.indexOf('/')+1, jarUrl.indexOf('!')); 
+0

Esto fallará miserablemente si hay caracteres especiales (porcentaje codificado) en la URL. – cbley

1

Esta solución manejará los espacios en la ruta.

String url = "jar:file:/C:/dir%20with%20spaces/myjar.jar!/resource"; 
String fileUrl = url.substring(4, url.indexOf('!')); 
File file = new File(new URL(fileUrl).toURI()); 
String fileSystemPath = file.getPath(); 

o con un objeto URL, para empezar:

... 
String fileUrl = url.getPath().substring(0, url.indexOf('!')); 
... 
1

sólo tenía que hacer esto.

 URL url = clazz.getResource(clazz.getSimpleName() + ".class"); 
     String proto = url.getProtocol(); 
     boolean isJar = proto.equals("jar"); // see if it's in a jar file URL 

     if(isJar) 
     { 
      url = new URL(url.getPath()); // this nicely strips off the leading jar: 
      proto = url.getProtocol(); 
     } 

     if(proto.equals("file")) 
     { 
      if(isJar) 
       // you can truncate it at the last '!' here 
     } 
     else if(proto == "http") { 
      ... 
0
//This code will work on both Windows and Linux 
    public String path() 
    { 
    URL url1 = getClass().getResource(""); 
    String urs=url1.toString(); 
    urs=urs.substring(9); 
    String truepath[]=urs.split("parser.jar!"); 
    truepath[0]=truepath[0]+"parser.jar"; 
    truepath[0]=truepath[0].replaceAll("%20"," "); 
    return truepath[0]; 
    } 
-1

Usted puede hacer this.This obras

ClassLoader loader = this.getClass().getClassLoader(); 
    URL url = loader.getResource("resource name"); 
    String[] filePath = null; 
    String protocol = url.getProtocol(); 
    if(protocol.equals("jar")){ 
     url = new URL(url.getPath()); 
     protocol = url.getProtocol(); 
    } 
    if(protocol.equals("file")){ 
     String[] pathArray = url.getPath().split("!"); 
     filePath = pathArray[0].split("/",2); 
    } 
    return filePath[1]; 
+0

No funciona: ¡la parte de la cuerda después! aún no se elimina – tribbloid

Cuestiones relacionadas