我遇到一种情况,需要扫描运行时类路径以查找资源文件(例如,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/