代码之家  ›  专栏  ›  技术社区  ›  Frank

如何将inputstream转换为fileinputstream

  •  51
  • Frank  · 技术社区  · 14 年前

    我的程序中有这一行:

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

    但是我如何从中获取文件输入流[资源输入流]?

    3 回复  |  直到 9 年前
        1
  •  57
  •   BalusC    9 年前

    使用 ClassLoader#getResource() 相反,如果其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以请求 输入流 相反。如果是第三方的,一定要把它报告为bug。在这个特定的例子中,我还会在该API的其余部分加上问号。

        2
  •  12
  •   whiskeysierra    14 年前

    长话短说: 不使用fileinputstream 作为参数或变量类型。使用抽象基类,在本例中改为inputstream。

        3
  •  0
  •   Community miroxlav    7 年前

    你需要这样的东西:

        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中工作。我也解释过同样的问题 here .