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

Java 每次使用后是否应关闭溪流?,java,inputstream,outputstream,objectoutputstream,bytearrayinputstream,Java,Inputstream,Outputstream,Objectoutputstream,Bytearrayinputstream,我目前正在一个游戏的UDP服务器上工作。在此服务器中,使用ByteArrayInputStream和ObjectInputStream每个勾号将序列化字节转换为对象。为流创建一个变量并在程序关闭时关闭一次是否更有效 像这样: class Main { private static ByteArrayInputStream byteIn; private static ObjectInputStream objectIn; public static void main(String[] arg

我目前正在一个游戏的UDP服务器上工作。在此服务器中,使用
ByteArrayInputStream
ObjectInputStream
每个勾号将序列化字节转换为对象。为流创建一个变量并在程序关闭时关闭一次是否更有效

像这样:

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();
  }
}
还是每次创建和关闭新流都更有效

像这样:

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();
  }
}

如果你打开一条小溪,你应该把它关闭。问题中的代码没有做到这一点,它只是放弃以前的流,只关闭它创建的最后一个流

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

public static void receive(){
    try (
        ByteArrayInputStream byteIn = new ByteArrayInputStream();
        ObjectInputStream objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
    ) {
        //do something
    }
}
当控件超出
try
时,它们将自动关闭

如果由于某种原因,它们有成为静态类成员,只需关闭并释放您创建的每个类成员(但代码中更容易出现bug,这意味着它的执行路径无法做到这一点)



旁注:对于这三种流类型,您可能不需要将
byteIn
作为单独的变量。更多信息。

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

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