【问题标题】:'try with resource' feature for File class文件类的“尝试资源”功能
【发布时间】:2013-05-02 11:47:41
【问题描述】:

我有一个场景,我正在尝试使用 Java 7 的“尝试使用资源”功能来实现。

我的 finally 块包含 BufferedWriterFile 的对象,我想使用“尝试使用资源”功能来关闭它,而不是通过显式调用 close 方法来关闭它。

但是我在网上查了一下,发现File 类没有实现AutoCloseable 接口,但是BufferedWriter 实现了。那么我该如何管理这个场景来实现“使用资源尝试”功能呢?

【问题讨论】:

  • File 类没有 open() 方法或 close() 方法,所以为什么它应该自动关闭是一个谜。需要关闭的是 BufferedInputStream。不是一个真正的问题。

标签: java file-io try-catch java-7


【解决方案1】:

您不需要关闭 File,因为它是一个纯 Java 对象。它基本上只是保存文件的名称,没有别的(即它不需要任何操作系统资源来构建)。

你只需要关闭你的BufferedWriter,那是正确的AutocCloseable

【讨论】:

  • 我正要问一个 File 对象是否会留下一个打开的文件句柄:)
【解决方案2】:
 try (BufferedWriter br = new BufferedWriter(new FileWriter(path))) 

简单地使用这个,br 会自动关闭。 例如。 http://www.roseindia.net/java/beginners/java-write-to-file.shtml

【讨论】:

  • 所以这里你说的不是创建File对象,而是直接把文件的路径传给FileReader构造函数,绕过File对象的创建。对吧?
  • 是的,当然,FileWriter 提供了一个类似 public FileWriter(String fileName)throws IOException 构造一个给定文件名的 FileWriter 对象。
  • @milind:如果你愿意,你仍然可以使用File 对象。你根本不需要关闭它!
【解决方案3】:

你不能只用 File 创建一个 BufferedWriter,BufferedWriter 需要一个 Writer,它应该是这样的

    try (BufferedWriter w = new BufferedWriter(new FileWriter(new File("file")))) {
        ...
    }

try-with-resources 只会在 BufferedWriter 上调用 close。不幸的是,BufferedWriter API 确实说它关闭了底层编写器,但实际上确实如此。至于 File 它与 try-with-resources 无关,因为它不是 Autocloseable。

【讨论】:

  • 这将如何提供帮助。您是说如果我按照您指定的方式创建 File 对象,那么当控件移出 try 块 BufferedWriter 时,FileWriter 以及 File 将自动关闭?
  • @milind:那么请不要忘记投票任何帮助您解决问题的答案并接受最有帮助的答案。
  • @Joachim Sauer Ya 谢谢提醒。我对对我有帮助的答案投了赞成票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2014-02-03
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多