2016-02-05 2 views
4

У нас есть resolve, который преобразует a/b + c/d в a/b/c/d.Отрежьте URI по отношению к другому

У нас есть relativize который преобразует a/b + a/b/c/d в c/d.

Есть ли способ трансформировать a/b/c/d + c/d в a/b?


Для моей особой проблемы (пути к классам) в URI, не конвертируются в java.nio.file.Path с, с погрешностью

java.nio.file.InvalidPathException: Illegal char <:> at index 3: jar:file:/D:/devel/somejar.jar!/foo/Bar.class 

Я хочу, чтобы разрешить каталог записи (например, с учетом Bar.class) и URI при условии, что getClassLoader().getResource().toURI() - jar:file:/D:/devel/somejar.jar!/foo.

ответ

1

Вы можете использовать java.nio.file.Path, но вам нужно будет использовать пользовательскую файловую систему, поскольку схема URI здесь jar не file. This page показан пример.

URI uri = URI.create("jar:file:/D:/devel/somejar.jar!/foo/Bar.class"); 

String[] array = uri.toString().split("!"); 
String jarFile = array[0]; 
String entryPath = array[1]; 
try(FileSystem fs = FileSystems.newFileSystem(URI.create(jarFile), new HashMap<>())) { 
    Path path = fs.getPath(entryPath); 
    URI parentUri = path.getParent().toUri(); 
    ... 
} 

Или легкий путь, используя подстроку:

URI uri = URI.create("jar:file:/D:/devel/somejar.jar!/foo/Bar.class"); 
URI parent = URI.create(uri.toString().substring(0, uri.toString().lastIndexOf("/"))); 
+0

Этот подход требует, чтобы classloader возвращал путь 'jar:'. Любой способ сделать первую часть ('toString.split()') более общей? – WorldSEnder

+0

Каковы возможные типы URI, которые могут быть возвращены загрузчиком классов? Если ресурс всегда находится в файловой системе, то есть в файле класса или внутри Jar, тогда 'java.nio.file.Path' и' java.io.File' должно быть более чем достаточно для получения родительских путей. – manouti

+0

Я не совсем уверен, что все в файловой системе, но когда вы так выразились, я думаю, этого достаточно. Я еще не соглашусь с ответом, так как более общий вопрос не был удовлетворительным, хотя (когда 'c' является полным путем, я сделаю это более понятным) – WorldSEnder

0

Я не уверен, что именно вы хотите достичь. Вы можете просто удалить конечную часть пути с помощью регулярного выражения. Я использовал пример String.class.

public static void main(final String[] args) throws Exception { 
    // get URI of class 
    String clazz = "String.class"; 

    URI resourceURI = String.class.getResource(clazz).toURI(); 
    System.out.println(resourceURI); 
    System.out.println(resourceURI.toString().replaceAll("^(.+?)!?/?" + clazz + "$", "$1")); 

    clazz = "/lang/String.class"; 
    System.out.println(resourceURI.toString().replaceAll("^(.+?)!?/?" + clazz + "$", "$1")); 

    clazz = "java/lang/String.class"; 
    System.out.println(resourceURI.toString().replaceAll("^(.+?)!?/?" + clazz + "$", "$1")); 
} 

Если вы хотите, чтобы попытаться загрузить данные в путь, то вы можете сделать следующее:

public static void main(final String[] args) throws Exception { 
    // get URI of class 
    String clazz = "String.class"; 

    URI resourceURI = String.class.getResource(clazz).toURI(); 
    System.out.println(resourceURI.getScheme()); 
    System.out.println(resourceURI.getRawSchemeSpecificPart()); 
    URI fileURI = new URI(resourceURI.getRawSchemeSpecificPart()); 
    System.out.println(fileURI.getScheme()); 
    System.out.println(fileURI.getRawSchemeSpecificPart()); 
    Path path = Paths.get(fileURI); 
    System.out.println(path); 
    System.out.println(path.getParent()); 
} 
1
URI uri = Main.class.getClassLoader().getResource("java/net/URISyntaxException.class").toURI(); 
//URI uri = URI.create("jar:file:/D:/devel/somejar.jar!/foo/Bar.class"); 
System.out.println(uri.toString()); 
System.out.println(Paths.get(uri.toString()).getParent()); 

банку Файл: /Library/Java/JavaVirtualMachines/jdk1.8.0 _31.jdk/Содержание/Главная/jre/lib/rt.jar! /java/net/URISyntaxException.class jar: файл: /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib /rt.jar!/java/net

toString является фокусом

+0

Я получаю« Исключение в потоке »main« java .nio.file.InvalidPathException: Illegal char <:> по индексу 3: jar: файл:/D: /bin/Java/jdk8u65/jre/lib/rt.jar!/java/net/URISyntaxException.class' в строке 4. – WorldSEnder

+0

Ах! http://stackoverflow.com/questions/9834776/java-nio-file-path-issue Windows vs Linux saga продолжается :) –

Смежные вопросы