【问题标题】:Convert a classpath filename to a real filename将类路径文件名转换为真实文件名
【发布时间】:2012-12-19 04:25:18
【问题描述】:

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

例如,假设目录"C:\workspace\project\target\classes" 在您的类路径中。该目录中有一个文件,例如info.properties

如果仅给定字符串 "info.properties",您将如何确定(在运行时)info.properties 文件的绝对文件路径?

结果将类似于"C:\workspace\project\target\classes\info.properties"

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

注意:我自己回答了这个问题,因为我觉得这是一个有用的技巧,但看起来以前没有人问过这个问题。

【问题讨论】:

    标签: java classpath filepath


    【解决方案1】:

    结合使用 ClassLoader.getResource() 和 URL.getFile()

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

    Windows注意:在上面的例子中,实际结果会是

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

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

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

    【讨论】:

    • 如果资源在 jar 中会产生什么结果?
    • @radai 这是 jar 中文件的结果示例:file:/C:/tools/some/path/jarfile.jar!/internal/path/file.txt。要使用上面的答案找到这样的文件,您必须提供相对于 jar 根目录的路径 - 即。 "internal/path/file.txt"
    • @radai 还要检查this
    • 简直太棒了。您在回答中提到了 Windows,但我只是在 Linux 上运行它没问题。
    • 这不适用于其中包含非 URL 安全字符(如空格)的文件名,因为它们将在 getFile 的返回值中进行百分比编码。
    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2014-05-04
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多