如果我重新实例化一个扫描器,旧的会关闭吗?

If I reinstantiate a Scanner, does the old one close?

我有这个代码:

Scanner fileReader = new Scanner(myFile);
// some code
fileReader = new Scanner(myFile);
// some more code
fileReader.close();

它做了我想要它做的事(再次从文件顶部启动 reader)但是我是否通过实例化两次并只关闭一次使扫描仪保持打开状态?我应该在重新实例化之前关闭吗?我的方法很管用,但我想知道这是否是个好习惯。

If I reinstantiate a Scanner, does the old one close?

没有。

Should I have closed before I reinstantiated?

是的。

What I have works, but I'd like to know whether it's good practice or not.

这是不好的做法。这是 资源泄漏。如果你这样做太多,你可能会发现 new Scanner(myFile) 会抛出一个异常,抱怨它 运行 超出文件描述符(或类似的东西)。

推荐的做法是使用 try with resources 语法来确保扫描器无论如何都会关闭。 (或者,如果你是 "old school" 和/或卡在 Java 6 或更早的版本......请在 finally 块中关闭扫描器......小心。)

示例:

   try (Scanner fileReader = new Scanner(myFile)) {
      // some code
   }
   try (Scanner fileReader = new Scanner(anotherFile)) {
      // some more code
   }

没有必要明确关闭任何一个 fileReader。每个 try 都有一个隐含的 finally 块调用 close 所有 Closeable 资源,比如我们在那里创建的 Scanner 对象。)