为什么Scanner.close()在Java中很有用?
我知道它是为了资源而运作的。 但是,如果没有检测到进一步的使用,它不会像其他对象一样自动关闭吗? 出于同样的原因,我从不解构一个物体,这是一个坏习惯吗?为什么Scanner.close()在Java中很有用?,java,java.util.scanner,Java,Java.util.scanner,我知道它是为了资源而运作的。 但是,如果没有检测到进一步的使用,它不会像其他对象一样自动关闭吗? 出于同样的原因,我从不解构一个物体,这是一个坏习惯吗? 非常感谢。Scanner打开一个底层操作系统的文件描述符(或文件通道或流),它通常是用非托管(通常是C语言)编写的 一个保持打开的流,有时可以一直保持打开状态,直到内核决定关闭它(比如,在程序完成执行之后……高度依赖于实现) 因此,显式关闭资源是个好主意。java.util.Scanner.close()方法关闭此扫描仪。如果此扫描仪尚未关闭,
非常感谢。
Scanner
打开一个底层操作系统的文件描述符(或文件通道或流),它通常是用非托管(通常是C
语言)编写的
一个保持打开的流,有时可以一直保持打开状态,直到内核决定关闭它(比如,在程序完成执行之后……高度依赖于实现)
因此,显式关闭资源是个好主意。java.util.Scanner.close()方法关闭此扫描仪。如果此扫描仪尚未关闭,则如果其底层readable也实现了
Closeable
接口,则将调用readable的close方法。如果此扫描仪已关闭,则调用此方法将无效。我们需要关闭扫描仪,因为
因此,建议使用close()。创建新扫描仪时,从技术上讲,您保留对资源的引用。比方说,我们正在使用InputStream读取一个文件,您将拥有一个指向InputStream对象的指针 当我们读取完对象/文件并且处理程序仍然打开时,我们仍然引用该对象,即使我们不需要它。调用close explicity要求释放资源,因为我们没有使用它。 如果我们对资源有限制(例如:对DB有限制,允许500次读取),这会使GC更容易,因为释放了未使用的引用,可能需要更少的时间
一种更好的想象方式,在SQLConnection中。如果不使用一个连接,为什么要保持它 如果它是垃圾收集的(实际上不是扫描器,因为它没有实现
finalize
,但是FileInputStream
实现),它将被关闭,当需要的内存超过当前可用内存时,就会发生这种情况。如果你有很多内存,那可能需要很长时间,在你用完可用的文件描述符之后很长时间。垃圾收集可能永远不会发生。您不能依赖GC为您释放资源@事实上,这是一个非常严重的错误,我正在重新评论。