java - 如何获取运行时类路径上资源的文件句柄?

标签 java file-io classpath

我遇到一种情况,需要扫描运行时类路径以查找资源文件(例如,res/config/meta.cfg),然后创建一个文件处理它。我能想到的最好的办法是:

// This file is located inside a JAR that is on the runtime classpath.
String fileName = "res/config/meta.cfg";

try {
    InputStream inStream = ClassLoader.getSystemResourceAsStream(fileName);
    File file = new File(String.format("${java.io.tmpdir}/%s", fileName));
    FileOutputStream foutStream = null;
    foutStream = new FileOutputStream(file);

    int read = 0;
    byte[] bytes = new byte[1024];
    while((read = inStream.read(bytes)) != -1)
        foutStream.write(bytes, 0, read);

    foutStream.close();

    return file;
} catch (Exception exc) {
    throw new RuntimeException(exc);
}

因此,本质上,将资源作为 InputStream 读取,然后将流写入临时文件(在 {$java.io.tmpdir} 下),以便我们可以获得它的有效File句柄。

这看起来就像绕着谷仓转了三圈。有没有更好/更简单/更优雅的方法来做到这一点?提前致谢!

最佳答案

没有。

当然可以(而且可能应该)use a library to copy InputStream 的内容到文件,但这显然不是您问题的重点。

类路径不仅仅包含目录;资源可以位于文件内部(通常是 JAR)或服务器上,并且可能不作为可以通过 java.io.File 对象访问的东西存在。

通常,核心问题是使用 java.io.File 对象,其中 InputStream 就足够了。有时,在使用第三方库时你无法采取任何措施,但这表明库设计者工作得不够仔细。如果您需要在自己的代码中使用文件句柄,您应该再看看为什么它不能是 InputStream。大多数时候可以。

关于java - 如何获取运行时类路径上资源的文件句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18979295/

相关文章:

java - 将 Xtend 源文件导入 Java 项目

java - Android 中的 Toast 消息不可见\弹出

java - Dozer 深度映射 Set<ComplexObject> 到 Set<String>

c - 如何将使用execl运行的进程的输出写入c中的文件

java - 将 Java 对象保存到文件中

node.js - ENOENT 在 Express Endpoint 上没有用于 readFileSync 的此类文件

java - 拆分文本文件条目以添加到数组列表中

Tomcat 无法从 list 文件中选择类路径

Java -cp 目录不工作,文件工作正常

java - 使用提供的依赖项构建 Artifact ,然后从命令行选择并指定它