每次使用后是否应关闭流?

时间:2019-03-25 13:13:21

标签: java inputstream outputstream objectoutputstream bytearrayinputstream

我目前正在为游戏使用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();
  }
}

2 个答案:

答案 0 :(得分: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中的更多内容。

答案 1 :(得分:2)

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