切断相对于另一个的 URI
Cut off URIs with respect to another
我们有 resolve
将 a/b
+ c/d
转换为 a/b/c/d
。
我们有 relativize
将 a/b
+ a/b/c/d
转换为 c/d
。
有没有办法将 a/b/c/d
+ c/d
转换为 a/b
?
对于我的特殊问题(类路径),URI 无法转换为 java.nio.file.Path
s,出现错误
java.nio.file.InvalidPathException: Illegal char <:> at index 3: jar:file:/D:/devel/somejar.jar!/foo/Bar.class
我想解析条目的目录(例如给定 Bar.class
)和 getClassLoader().getResource().toURI()
生成的 URI
到 jar:file:/D:/devel/somejar.jar!/foo
。
您可以使用 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("/")));
我不确定你到底想达到什么目的。您可以使用正则表达式简单地删除路径的结尾部分。我以 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 + "$", ""));
clazz = "/lang/String.class";
System.out.println(resourceURI.toString().replaceAll("^(.+?)!?/?" + clazz + "$", ""));
clazz = "java/lang/String.class";
System.out.println(resourceURI.toString().replaceAll("^(.+?)!?/?" + clazz + "$", ""));
}
如果您想尝试将数据加载到路径中,则可以执行以下操作:
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());
}
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());
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/rt.jar!/java/net/URISyntaxException.class
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/rt.jar!/java/net
toString 是诀窍
我们有 resolve
将 a/b
+ c/d
转换为 a/b/c/d
。
我们有 relativize
将 a/b
+ a/b/c/d
转换为 c/d
。
有没有办法将 a/b/c/d
+ c/d
转换为 a/b
?
对于我的特殊问题(类路径),URI 无法转换为 java.nio.file.Path
s,出现错误
java.nio.file.InvalidPathException: Illegal char <:> at index 3: jar:file:/D:/devel/somejar.jar!/foo/Bar.class
我想解析条目的目录(例如给定 Bar.class
)和 getClassLoader().getResource().toURI()
生成的 URI
到 jar:file:/D:/devel/somejar.jar!/foo
。
您可以使用 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("/")));
我不确定你到底想达到什么目的。您可以使用正则表达式简单地删除路径的结尾部分。我以 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 + "$", ""));
clazz = "/lang/String.class";
System.out.println(resourceURI.toString().replaceAll("^(.+?)!?/?" + clazz + "$", ""));
clazz = "java/lang/String.class";
System.out.println(resourceURI.toString().replaceAll("^(.+?)!?/?" + clazz + "$", ""));
}
如果您想尝试将数据加载到路径中,则可以执行以下操作:
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());
}
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());
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/rt.jar!/java/net/URISyntaxException.class jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/rt.jar!/java/net
toString 是诀窍