如何将 InputStream 转换为 FileInputStream

我的程序里有这么一行:

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name");

但是如何从中获取 FileInputStream [ Resource _ InputStream ] ?

155781 次浏览

如果其 URI 表示有效的本地磁盘文件系统路径,则使用 ClassLoader#getResource()

URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...

如果没有(例如 JAR) ,那么最好的办法是将它复制到一个临时文件中。

Path temp = Files.createTempFile("resource-", ".ext");
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING);
FileInputStream input = new FileInputStream(temp.toFile());
// ...

也就是说,我实在看不出这样做有什么好处,或者它必须是一个差劲的 helper 类/方法所需要的,这个类/方法需要的是 FileInputStream而不是 InputStream。如果可以的话,只需修复 API 来请求一个 InputStream代替。如果是第三方的,一定要报告为错误。在这个特定的例子中,我还在 API 的其余部分打了问号。

长话短说: 不要使用 FileInputStream 作为参数或变量类型。

你需要这样的东西:

    URL resource = this.getClass().getResource("/path/to/resource.res");
File is = null;
try {
is = new File(resource.toURI());
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
FileInputStream input = new FileInputStream(is);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

但是它只能在您的 IDE 中工作,而不能在可运行的 JAR 中工作。