每次使用后都应该关闭流吗?
Should streams be closed after every use?
我目前正在为一款游戏开发 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();
}
}
如果您打开流,则应将其关闭。问题中的代码不会那样做,它只是放弃以前的流并只关闭它创建的最后一个流。
不清楚为什么这些流变量应该是 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
class 成员,只需关闭并释放您创建的每个成员(但这更容易您的代码中有错误,这意味着它的执行路径无法做到这一点。
// All done
objectIn.close();
objectIn = null;
byteIn.close();
byteIn = null;
旁注:对于这三种流类型,您可能不需要 byteIn
作为单独的变量。 .
中的更多内容
是的,您需要关闭流。使用 try-with-resources 块。它将为您关闭流。
我目前正在为一款游戏开发 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();
}
}
如果您打开流,则应将其关闭。问题中的代码不会那样做,它只是放弃以前的流并只关闭它创建的最后一个流。
不清楚为什么这些流变量应该是 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
class 成员,只需关闭并释放您创建的每个成员(但这更容易您的代码中有错误,这意味着它的执行路径无法做到这一点。
// All done
objectIn.close();
objectIn = null;
byteIn.close();
byteIn = null;
旁注:对于这三种流类型,您可能不需要 byteIn
作为单独的变量。
是的,您需要关闭流。使用 try-with-resources 块。它将为您关闭流。