为了账号安全,请及时绑定邮箱和手机立即绑定

我需要在每个新的输入流上调用close()吗?

我需要在每个新的输入流上调用close()吗?

智慧大石 2022-08-03 10:40:38
这是代码。public static void main(String[] args) throws IOException {    FileInputStream fis = null;    fis = new FileInputStream(new File("D:\\za180s.ser"));    // do something    fis = new FileInputStream(new File("D:\\za185s.ser"));    // do something    fis = new FileInputStream(new File("D:\\za186s.ser"));    // do something    fis = new FileInputStream(new File("D:\\za187s.ser"));    // do something    fis.close();}问题是:每次“做某事”后都需要我调用fis.close()方法,或者我只是调用fis.close()一次。忽略 close() 位置是否最终和代码需要尝试 catch 。所有。
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

是的,您需要对每个人进行关闭。代码的问题在于,每次创建新流时都要重新分配变量。换句话说:不再指向旧的,所以调用关闭不会关闭以前的流。InputStreamfisfisInputStream


有关详细信息,请查看 https://stackoverflow.com/a/40523/8819761


您还可以使用Java 7的try-with-resources语法,该语法将在您退出try块后自动关闭流:


try (InputStream fis = new FileInputSteam(yourFile)) {

  // Do something

}


try (InputStream fis = new FileInputSteam(yourFile)) {

  // Do something else

}


查看完整回答
反对 回复 2022-08-03
?
临摹微笑

TA贡献1982条经验 获得超2个赞

您需要每次都调用 close 方法,但现在不用担心。从 Java SE 7 中,您可以使用 .根据Java-Oracle Doc,try-with-resources


使用资源试用语句是声明一个或多个资源的 try 语句。资源是在程序完成之后必须关闭的对象。资源试用语句确保在语句末尾关闭每个资源。任何实现 java.lang.AutoCloseable 的对象(包括实现 java.io.Closeable 的所有对象)都可以用作资源。


请看一下例子。


static String readFirstLineFromFile(String path) throws IOException {

    try (BufferedReader br =

                   new BufferedReader(new FileReader(path))) {

        return br.readLine();

    }

}

在此示例中,在 try-with-resources 语句中声明的资源是 BufferedReader。声明语句显示在 try 关键字后面的括号内。在 Java SE 7 及更高版本中,BufferedReader 类实现了 java.lang.AutoCloseable 接口。由于 BufferedReader 实例是在 try-with-resource 语句中声明的,因此无论 try 语句是正常完成还是突然完成(由于方法 BufferedReader.readLine 引发 IOException),它都将关闭。


有关更多详细信息,请查看 Oracle-Java 文档以获取 。try-with-resources


https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html


查看完整回答
反对 回复 2022-08-03
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

每次使用 InputStream 时,您都必须关闭。

在 java 中,如果分配

 fis = new FileInputStream(new File("D:\\za180s.ser"));

fis将指向新对象,因此当您调用fis.close()时,旧流不受影响。而且没有办法关闭它。


查看完整回答
反对 回复 2022-08-03
  • 3 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信