我正在尝试实现以下目标:从给定的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
和语言库,以便在编译器中使用它们。
答案 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);
}
希望这会有所帮助。