Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Scanner.close()在Java中很有用?_Java_Java.util.scanner - Fatal编程技术网

为什么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方法。如果此扫描仪已关闭,则调用此方法将无效。

我们需要关闭扫描仪,因为

  • 它清空底层可读对象(输入源),以帮助垃圾收集
  • 不允许对扫描仪对象进行进一步操作,并将导致iIllegalStateException

  • 因此,建议使用close()。

    创建新扫描仪时,从技术上讲,您保留对资源的引用。比方说,我们正在使用InputStream读取一个文件,您将拥有一个指向InputStream对象的指针

    当我们读取完对象/文件并且处理程序仍然打开时,我们仍然引用该对象,即使我们不需要它。调用close explicity要求释放资源,因为我们没有使用它。 如果我们对资源有限制(例如:对DB有限制,允许500次读取),这会使GC更容易,因为释放了未使用的引用,可能需要更少的时间


    一种更好的想象方式,在SQLConnection中。如果不使用一个连接,为什么要保持它

    如果它是垃圾收集的(实际上不是扫描器,因为它没有实现
    finalize
    ,但是
    FileInputStream
    实现),它将被关闭,当需要的内存超过当前可用内存时,就会发生这种情况。如果你有很多内存,那可能需要很长时间,在你用完可用的文件描述符之后很长时间。垃圾收集可能永远不会发生。您不能依赖GC为您释放资源@事实上,这是一个非常严重的错误,我正在重新评论。