Java 如何将InputStream转换为FileInputStream

Java 如何将InputStream转换为FileInputStream,java,file-io,Java,File Io,我的程序中有一行: InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name"); 但是如何从它获取FileInputStream[Resource\u InputStream]?如果它的URI表示有效的本地磁盘文件系统路径,请改用 URL resource = classLoader.getResource("resource.ext"); File

我的程序中有一行:

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name");
但是如何从它获取FileInputStream[Resource\u InputStream]?

如果它的URI表示有效的本地磁盘文件系统路径,请改用

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());
// ...
也就是说,我真的看不出这样做有什么好处,或者它一定是一个可怜的助手类/方法所需要的,它需要
FileInputStream
而不是
InputStream
。如果可以的话,只需修改API以请求
InputStream
。如果它是第三方的,请务必将其报告为bug。在本例中,我还将在API的其余部分打上问号。

长话短说:
不要将FileInputStream用作参数或变量类型。使用抽象基类,在本例中为InputStream。

您需要类似以下内容:

    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中工作,不能在runnable JAR中工作。我也解释了同样的问题。

为什么需要FileInputStream?你确定有一个实际的文件支持你的资源,而不是JAR文件中的条目吗?我不喜欢这个答案,有时候你真的需要FileInputStream,因为你需要来自API的方法,比如getChannel(),他没有问使用InputStream是否是个好主意,只是问是否可以从输入流创建文件输入流。您可以使用注释而不是添加新答案。java.util.Properties呢?而不是
FileInputStream input=newfileinputstream(temp.toFile()),我使用了
FileInputStream input=newfileinputstream(temp.toString())。因为
temp.toFile
可能会留下一个空(FileInputStream)输入。出于可能的原因,您可以检查Path.toFile java api文档