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

我可以使用已经创建的inputstream的try-with资源吗?

  •  4
  • mal  · 技术社区  · 6 年前

    这样地:

    public void myMethod(InputStream fileIn){
        try (InputStream in = fileIn)  {
            do stuff....
        }
    }
    

    它似乎起作用了。安全吗?

    1 回复  |  直到 6 年前
        1
  •  12
  •   Andy Turner    6 年前

    好像有用

    如果你再加一点就行了 InputStream (或某种超类型的 输入流 )之前 in : language spec requires 您可以为每个资源声明一个变量。

    try (InputStream in = fileIn) { ... }
    

    或者直接引用 fileIn ,在Java 9 +中:

    try (fileIn) { ... }
    

    没有理由不这样做:使用变量声明表单,您将为变量分配一个表达式(一个新类、一个方法调用的结果、一个数组元素等)。资源看不到它是否正在获取一个“新”实例:它只是一个具有正确类型值的东西。

    安全吗?

    取决于你所说的“安全”是什么意思。

    从某种意义上说,它在本代码中不会出错,这当然是安全的,并且 in.close() 将在块的末尾调用。

    但是,这违反了经验法则,“如果没有打开一条流,就不要关闭它”。因此,从某种意义上说,它可能不安全,因为它会导致程序的其他部分发生意外故障,而这些部分期望在调用方法后流仍然打开。