Java将Jar URL转换为File

时间:2015-08-21 17:54:42

标签: java file url jar uri

我正在尝试实现以下目标:从给定的Class对象,我希望能够检索它所在的文件夹或文件。这也应该适用于像java.lang.String这样的系统类(它将返回rt.jar的位置)。对于'source'类,该方法应该返回根文件夹:

- bin
  - com
    - test
      - Test.class

将返回bin的{​​{1}}文件夹的位置。这是我到目前为止的实现:

file(com.test.Test.class)

但是,此代码失败,因为public static File getFileLocation(Class<?> klass) { String classLocation = '/' + klass.getName().replace('.', '/') + ".class"; URL url = klass.getResource(classLocation); String path = url.getPath(); int index = path.lastIndexOf(classLocation); if (index < 0) { return null; } // Jar Handling if (path.charAt(index - 1) == '!') { index--; } else { index++; } int index1 = path.lastIndexOf(':', index); String newPath = path.substring(index1 + 1, index); System.out.println(url.toExternalForm()); URI uri = URI.create(newPath).normalize(); return new File(uri); } 构造函数抛出File(URI) - “URI不是绝对的”。我已经尝试使用IllegalArgumentException来构造文件,但是对于带有空格的目录结构,这个失败了,如下所示:

newPath

这是因为URL表示使用- Eclipse Workspace - MyProgram - bin - Test.class 来表示文本构造函数无法识别的空格。

是否有一种高效可靠的方法来获取Java类的(类路径)位置,该类适用于目录结构和Jar文件?

请注意,我不需要确切类的确切文件 - 只有容器!我使用此代码来定位%20和语言库,以便在编译器中使用它们。

1 个答案:

答案 0 :(得分:1)

您的代码中的轻微修改应该适用于此处。您可以尝试以下代码:

public static File getFileLocation(Class<?> klass)
{
    String classLocation = '/' + klass.getName().replace('.', '/') + ".class";
    URL url = klass.getResource(classLocation);
    String path = url.getPath();
    int index = path.lastIndexOf(classLocation);
    if (index < 0)
    {
        return null;
    }

    String fileCol = "file:";
    //add "file:" for local files
    if (path.indexOf(fileCol) == -1)
    {
        path = fileCol + path;
        index+=fileCol.length();
    }

    // Jar Handling
    if (path.charAt(index - 1) == '!')
    {
        index--;
    }
    else
    {
        index++;
    }

    String newPath = path.substring(0, index);

    System.out.println(url.toExternalForm());
    URI uri = URI.create(newPath).normalize();

    return new File(uri);
}

希望这会有所帮助。