2008-12-31 13 views

Odpowiedz

2

Nie wiesz jakiejkolwiek dokładnej metody, które dadzą Ci to, co chcesz, ale to powinno się zamknąć:

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

Nadzieja to pomaga.

+0

bardzo blisko, ale korzystanie z split() jest zbyt niski poziom parsowania dla mnie. Implementacja adresu URL Sun wydaje się nie zapewniać metod radzenia sobie z tą dziwną składnią jarfile.jar! Path/to/specific/file dla dziwnych adresów URL słoika firmy Sun; cały shebang (kalambur przeznaczony) jest zwracany przez getPath(). Ale JarURLConnection, jak wspomniano w starblue, wydaje się działać, chociaż tylko przez otwarcie słoika. – skiphoppy

27

Może to zrobić, jeśli MS-Windows nie jest obrażony przez wiodącego ukośnika:

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

Wybieram właśnie to rozwiązanie, chociaż żałuję, że nie było sposobu, aby to zrobić bez otwierania słoika (lub oczywiście parsowania); Wygląda na to, że adres URL musi zrozumieć to dziwne! składnia, lub też musi istnieć podklasa, która to rozumie. – skiphoppy

+6

(W języku Java 7) JarURLConnection nie otwiera pliku JAR po wykonaniu powyższego kodu. Po prostu analizuje adres URL w Twoim imieniu. – Gili

+1

Powinna być zaakceptowaną odpowiedzią! –

1

Niektórzy mogą uważać, że jest to nieco „hacky”, ale to będzie wykonać zadanie w tej instancji i jestem pewien, że byłoby to o wiele lepszy widok niż tworzenie wszystkich obiektów w innych sugestiach.

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

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

Nie powiedzie się to marnie, jeśli w adresie URL są jakieś specjalne (zakodowane w procentach) znaki. – cbley

1

To rozwiązanie obsłuży spacje na ścieżce.

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

lub obiektu URL zacząć:

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

po prostu musiałem to zrobić.

 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

Można zrobić this.This działa

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

Nie działa: ciąg po części! nadal nie jest usuwany – tribbloid