如果我重新实例化一个扫描器,旧的会关闭吗?
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
对象。)
我有这个代码:
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
对象。)