2013-01-04 55 views
11

如何将类路径上文件的名称转换为真实文件名?将类路径文件名转换为真实文件名

例如,假设目录"C:\workspace\project\target\classes"是在classpath。该目录内是一个文件,例如info.properties

如何判断(在运行时)的绝对文件路径info.properties文件,只给出字符串"info.properties"

结果会是这样的"C:\workspace\project\target\classes\info.properties"

为什么这很有用?编写单元测试时,您可能想要访问捆绑在测试资源(src/main/resources)中的文件,但它们正在使用第三方库或其他需要真实文件名而不是相对类路径引用的系统。

注:我已经回答了这个问题我自己,因为我觉得这是一个有用的技巧,但它看起来像没有人以往任何时候都问过这个问题。

回答

16

使用ClassLoader.getResource方法,()和URL.getFile()用于Windows

URL url = Thread.currentThread().getContextClassLoader().getResource(resource); 
if(url == null){ 
    throw new RuntimeException("Cannot find resource on classpath: '" + resource + "'"); 
} 
String file = url.getFile(); 

注意的组合:在上面的例子中,实际的结果将是

"/C:/workspace/project/target/classes/info.properties" 

如果您需要更类似于Windows的路径(即"C:\workspace\..."),请使用:

String nativeFilename = new File(file).getPath(); 
+5

如果资源位于jar中,会产生什么? – radai

+1

@radai这里是一个jar文件结果的例子:'file:/ C:/tools/some/path/jarfile.jar!/ internal/path/file.txt'。要使用上面的答案找到这样一个文件,你必须提供一个相对于jar根的路径 - 即。 ' “内部/路径/ file.txt的”' – GreenGiant

+0

@radai还要检查[此](http://stackoverflow.com/questions/12025689/filenotfoundexception-when-exporting-jar/12025740#12025740) –