相关疑难解决方法(0)

在Java中关闭嵌套流和编写器的正确方法

注意:这个问题及其大多数答案都发布在Java 7发布之前.Java 7提供了自动资源管理功能,可以轻松实现这一目标.如果您使用的是Java 7或更高版本,那么您应该转到Ross Johnson的答案.


什么被认为是在Java中关闭嵌套流的最佳,最全面的方法?例如,考虑设置:

FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
Run Code Online (Sandbox Code Playgroud)

我理解需要保证关闭操作(可能使用finally子句).我想知道的是,是否有必要明确确保嵌套流已关闭,或者只是确保关闭外部流(oos)?

我注意到的一件事,至少在处理这个具体的例子时,内部流似乎只是抛出FileNotFoundExceptions.这似乎意味着技术上不需要担心如果失败就关闭它们.

这是同事写的:


从技术上讲,如果实施得当,关闭最外层的流(oos)就足够了.但实施似乎有缺陷.

示例:BufferedOutputStream从FilterOutputStream继承close(),它将其定义为:

 155       public void close() throws IOException {
 156           try {
 157             flush();
 158           } catch (IOException ignored) {
 159           }
 160           out.close();
 161       }
Run Code Online (Sandbox Code Playgroud)

但是,如果flush()由于某种原因抛出运行时异常,则永远不会调用out.close().所以看起来"最安全"(但很丑陋)主要担心关闭FOS,即保持文件打开.


什么被认为是最好的,当你绝对需要确定,关闭嵌套流的方法?

是否有任何正式的Java/Sun文档可以详细解决这个问题?

java java-io

92
推荐指数
6
解决办法
4万
查看次数

对没有任何参考创建的资源使用“尝试资源”

考虑以下情况:

try (ResultSet resultSet = DriverManager.getConnection("jdbc:...", "user", "pass")
                                      .createStatement().executeQuery(sql)) {    
                    .
                    .
                    .
}
Run Code Online (Sandbox Code Playgroud)

这是在资源内部创建了三个资源的情况try: a Connection、 aStatement和 a ResultSet

try 块结束后这三个资源会发生什么变化?他们会全部关闭,即使他们没有任何提及它们,还是只会resultSet关闭?

AutoCloseable在尝试使用资源块时,在没有任何引用的情况下声明资源是否安全?

java try-with-resources autocloseable

7
推荐指数
3
解决办法
314
查看次数

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

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

像这样:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

或者每次创建和关闭新流是否更有效?

像这样:

class Main {

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

 public static void …
Run Code Online (Sandbox Code Playgroud)

java inputstream outputstream objectoutputstream bytearrayinputstream

5
推荐指数
1
解决办法
217
查看次数