如何将InputStream转换为FileInputStream

Fra*_*ank 58 java file-io

我的程序中有这一行:

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name");
Run Code Online (Sandbox Code Playgroud)

但是如何从它获取FileInputStream [Resource_InputStream]?

Bal*_*usC 63

使用ClassLoader#getResource()而不是如果URI表示一个有效的本地磁盘文件系统路径.

URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...
Run Code Online (Sandbox Code Playgroud)

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

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

也就是说,我真的没有看到这样做有什么好处,或者必须要求一个糟糕的帮助者类/方法来FileInputStream代替InputStream.如果可以的话,只需修改API即可InputStream.如果它是第三方,请务必将其报告为错误.我在这个特定的案例中也在该API的其余部分放置了问号.


whi*_*rra 12

简而言之: 不要将FileInputStream用作参数或变量类型.使用抽象基类,在本例中使用InputStream.

  • 我不喜欢这个答案,有时你真的需要一个FileInputStream,因为你需要来自其API的方法,例如getChannel(),他没有问是否使用InputStream是一个好主意,就好像它是否可以从输入流创建文件输入流.您可以使用评论而不是添加新答案. (20认同)