寻找有关java.net.URL不一致/错误的解决方法的建议

时间:2014-05-08 14:35:02

标签: java

以下代码公开了这个bug,我知道我可以直接调整getFile()&的结果。 getPath()但我正在寻找更优雅,更强大的东西。我希望能够在默认情况下在包含jar中的文件夹中行走,并使用用户选择/配置路径来查找&加载资源。

import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;

public class UrlBug {

UrlBug() {
    try {
        final URL resourceRoot = this.getClass().getClassLoader().getResource(".");
        System.out.println(resourceRoot.getFile());
        System.out.println(resourceRoot.getPath());
        System.out.println(resourceRoot.toURI());
        System.out.println(resourceRoot.toExternalForm());
        System.out.println(resourceRoot.toString());
        new URL(resourceRoot.getFile());
    } catch (final URISyntaxException e) {
        e.printStackTrace();
    } catch (final MalformedURLException e) {
        e.printStackTrace();
    }
}
public static void main(final String[] args) {
    new UrlBug();
}
}

以下使用' bug'

生成的输出
/C:/Users/Me/workspaces/.../target/classes/            <-- Malformed filename
/C:/Users/Me/workspaces/.../target/classes/            <-- Malformed path
file:/C:/Users/Me/workspaces/.../target/classes/
file:/C:/Users/Me/workspaces/.../target/classes/
file:/C:/Users/Me/workspaces/.../target/classes/

java.net.MalformedURLException: no protocol:
/C:/Users/Me/workspaces/scratch/target/classes/     at
java.net.URL.<init>(URL.java:585)   at
java.net.URL.<init>(URL.java:482)   at
java.net.URL.<init>(URL.java:431)   at
scratch.UrlBug.<init>(UrlBug.java:20)   at
scratch.UrlBug.main(UrlBug.java:39)

我已经准备好接受我的代码中的错误了。不过我认为这是网址类的问题,而Kohsuke似乎是agree

1 个答案:

答案 0 :(得分:1)

我不确定你为什么要自己走jar目录结构。 Java有现有的类来处理这种情况。要修复代码,您只需使用toString()方法:

new URL(resourceRoot.toString());

“file:/”前缀是“协议”。使用toString()方法可确保将“file:/”协议添加到字符串之前。根据文件:

Protocol handlers for the following protocols are guaranteed to exist on the search path:

     http, https, ftp, file, and jar

http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#URL(java.lang.String, java.lang.String, int, java.lang.String)