当前位置: 首页 > 面试题库 >

我是否必须关闭由PrintStream包装的FileOutputStream?

夏奕
2023-03-14
问题内容

我使用的是FileOutputStreamPrintStream这样的:

class PrintStreamDemo {  
    public static void main(String args[]) { 
        FileOutputStream out; 
        PrintStream ps; // declare a print stream object
        try {
            // Create a new file output stream
            out = new FileOutputStream("myfile.txt");

            // Connect print stream to the output stream
            ps = new PrintStream(out);

            ps.println ("This data is written to a file:");
            System.err.println ("Write successfully");
            ps.close();
        }
        catch (Exception e) {
            System.err.println ("Error in writing to file");
        }
    }
}

我只关门了PrintStream。我是否还需要关闭FileOutputStreamout.close();)?


问题答案:

不,您只需要关闭最外面的流。它将一直委托给包装的流。

但是,您的代码包含一个概念上的失败,应该在中发生关闭finally,否则当代码在打开和关闭之间引发异常时,它永远不会关闭。

例如

public static void main(String args[]) throws IOException { 
    PrintStream ps = null;

    try {
        ps = new PrintStream(new FileOutputStream("myfile.txt"));
        ps.println("This data is written to a file:");
        System.out.println("Write successfully");
    } catch (IOException e) {
        System.err.println("Error in writing to file");
        throw e;
    } finally {
        if (ps != null) ps.close();
    }
}

(请注意,我更改了代码以 引发 异常,以便您了解问题的原因,该异常即包含有关问题原因的详细信息)

或者,当您已经在使用Java 7时,也可以使用ARM(自动资源管理;也称为try-with-
resources
),这样您就不需要自己关闭任何东西:

public static void main(String args[]) throws IOException { 
    try (PrintStream ps = new PrintStream(new FileOutputStream("myfile.txt"))) {
        ps.println("This data is written to a file:");
        System.out.println("Write successfully");
    } catch (IOException e) {
        System.err.println("Error in writing to file");
        throw e;
    }
}


 类似资料:
  • 我们有一个java应用程序,我们使用多个语句变量。为什么需要多个语句的问题是,有时在为循环内的一个结果运行循环时,我们需要执行其他一些查询操作。大多数地方,单一的stmt被使用了很多次,最后我们关闭。现在我们要确认的是,我们没有关闭resultset变量,我们注意到内存的使用情况会波动。那么,在得到结果后立即关闭resultset的最佳机制是什么,还是在结束时关闭stmt之前关闭resultset

  • 问题内容: 我刚刚开始将自己的持久性框架迁移到JPA。 鉴于持久性框架隐藏了很多问题,我想知道不关闭EntityManagers是否会造成资源泄漏,或者框架是否会为我收集并关闭它们。 我打算在所有地方关闭它们,但是我必须关闭吗? 目前使用TopLink只是因为它可以轻松地与NetBeans一起使用,但是很高兴调查其他JPA提供程序。 问题答案: 这取决于您如何获得它。 如果使用EntityMana

  • 问题内容: 当我仅使用PHP的内置MySQL函数在PHP中打开MySQL连接时,我将执行以下操作: 当我打开与PDO的连接时,它看起来像这样: 我是否必须像与and 一样显式关闭连接?如果没有,PHP如何知道何时完成连接? TIA。 问题答案: 使用让PDO知道它可以关闭连接。 PHP:PDO连接和连接管理 成功连接到数据库后,PDO类的实例将返回到您的脚本。该连接在该PDO对象的生存期内保持活动

  • 问题内容: @Entity public class A { @GeneratedValue @Id private long id; 建立关系,我必须打电话 为什么两者都是必要的,为什么仅仅做是不够的 要么 ? 该关系存储在联接表中,并将更新该联接表。 但是当我之后进行查询时,它为空。这是为什么? 这是一个测试案例,说明了这个问题。请注意,最后一个断言失败。 动机: 当数量增加时,通过更改“仅一

  • 问题内容: 在Spring Data JPA文档中,它说明了有关流的信息: Stream可能包装了基础数据存储的特​​定资源,因此必须在使用后关闭。您可以使用close()方法或使用Java 7 try-with- resources块来手动关闭Stream。 参见:http : //docs.spring.io/spring- data/jpa/docs/1.10.1.RELEASE/refer

  • 问题内容: 我要问的是两种情况:技术上和风格上。 我的应用程序/守护进程可以在其中保存pidfile 吗? 这样做很不好吗? 我的需要是:我的守护程序在特定用户下运行,实现者必须在,chown和chgrp中的mkdir新目录中运行我的守护程序。似乎仅将pidfile保留在本地(对于守护程序)似乎更容易。 问题答案: 我不会将pidfile放在诸如的应用程序安装目录下。该目录可以是只读的,可以在机器