【问题标题】:Should streams be closed after every use?每次使用后都应该关闭流吗?
【发布时间】:2019-08-15 17:49:35
【问题描述】:

我目前正在为游戏开发 UDP 服务器。在此服务器中,每个刻度使用ByteArrayInputStreamObjectInputStream 将序列化字节转换为对象。为流创建一个变量并在程序关闭时关闭它们一次是否更有效?

像这样:

class Main {
private static ByteArrayInputStream byteIn;
private static ObjectInputStream objectIn;

public static void main(String[] args) {
    while(true){
      receive();
    }
    //when program is done call close();
}

 public static void receive(){
     byteIn = new ByteArrayInputStream();
     objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
      //do something
  }

 public static void close(){
    objectIn.close();
    byteIn.close();
  }
}

还是每次都更有效地创建和关闭新流?

像这样:

class Main {

public static void main(String[] args) {
    while(true){
      receive();
    }
}

 public static void receive(){
    ByteArrayInputStream byteIn = new ByteArrayInputStream();
    ObjectInputStream objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
    //do something
    objectIn.close();
    byteIn.close();
  }
}

【问题讨论】:

  • 在这两个示例中,由于无限循环,您将每秒创建数百万个输入流

标签: java inputstream outputstream objectoutputstream bytearrayinputstream


【解决方案1】:

是的,您需要关闭流。使用try-with-resources 块。它将为您关闭流。

【讨论】:

    【解决方案2】:

    如果你打开一个流,你应该关闭它。问题中的代码没有这样做,它只是放弃以前的流并仅关闭它创建的最后一个流。

    不清楚为什么这些流变量应该是static 而不是receive 中的本地变量。如果它们在receive 内是本地的,您可以使用try-with-resources 自动清理它们:

    public static void receive(){
        try (
            ByteArrayInputStream byteIn = new ByteArrayInputStream();
            ObjectInputStream objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
        ) {
            //do something
        }
    }
    

    当控制权超出try时,它们会自动关闭。

    如果他们出于某种原因必须成为 static 类成员,只需关闭并释放您创建的每个成员(但代码中更容易出现错误,这意味着它具有执行路径没有做到这一点)。

    // All done
    objectIn.close();
    objectIn = null;
    byteIn.close();
    byteIn = null;
    

    旁注:对于这三种流类型,您可能不需要将byteIn 作为单独的变量。更多内容请参见this question's answers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-25
      • 2011-09-23
      • 2016-07-06
      • 2010-10-07
      • 2017-11-05
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多