2017-05-24 116 views
2

假设我打开了一个扫描仪,无论是从System.in还是从一个文件,并且在程序中的某个点,我正在激活System.exit()(并且未调用scanner.close()之前),它如何(以及如果)影响扫描仪?Java - System.exit()和扫描仪

因为system.exit()方法关闭了JVM,所以与扫描器相关的所有东西都会被正确关闭,但我没有找到关于这种情况的任何具体信息。例如 - System.exit()之后,扫描仪打开的文件是否会被解锁(从扫描仪中“释放”)?在scanner.close()上激活的所有相关流程是否将被激活?以及System.exit()

回答

1

扫描仪是一个流,所以当程序终止流被自动关闭你的,但它是不好的做法,无法靠近溪流,因为在较大较长的运行程序,他们可能会出现问题,所以是一切正确关闭,但如早些时候说这是不好的做法。

如果你必须在同一时间将OutOfMemoryError而崩溃开放的许多河流,这里是这个

public static void main(String[] args) { 
LinkedList<Scanner> list = new LinkedList<>(); 
while(true) 
    list.add(new Scanner(System.in)); 
} 

一个例子,所以如果你没有时间长了会导致此内存错误后关闭您的流也请注意,这个错误不会造成因为在列表项太多是因为流

编辑:

public static void main(String[] args) { 
    Scanner first = new Scanner(System.in); 
    Scanner second = new Scanner(System.in); 
    int x = first.nextInt(); 
    int y = second.nextInt(); 
    System.out.println("First scan returns: " + x); 
    System.out.println("Second scan returns: " + y); 
    first.close(); 
    second.close(); 
} 

,你可以看到您可以打开多个System.in扫描程序,但是当读入变量时,您必须指定要使用的扫描仪对象。然而,当然这是毫无意义的,我不能想出为什么你需要一次打开多个System.in扫描器的任何原因。

+0

因此,扫描仪打开的所有文件都将在system.exit()处关闭。 您可以举一个可选问题的例子,可以在较大的程序中发生吗? – Mickey

+1

@Mickey是的,打开的所有文件和流都将像关闭方法一样关闭,现在大型程序中可能发生的问题将是OutOfMemoryError,因为您只能打开很多流一次,大多数程序甚至是大型程序都需要一段时间才能达到此限制,但是如果您有一台服务器或需要长时间运行的程序,可能会导致程序崩溃。 – Joking313

+0

谢谢。 对于您在评论中编辑过的示例,是否可以打开多个'system.in'扫描器?据我所知你不能。 另外,如何将'OutOfMemoryError'连接到'System.exit()'部分?我不太明白这一点。 – Mickey

-1

我会用这种方式回答你的问题。 java进程运行的操作系统是一个写得很好且经过无限测试的软件。当一个进程退出时(例如java进程),那么操作系统会:

  • 使可用的java进程使用的内存(RAM),即释放内存。
  • Java进程保存的文件描述符被清除。这将包括任何正在读取或写入的文件等。
  • 依此类推。

但是,这并不意味着Java过程不会遵循最佳实践。让我举个例子:假设java进程有两个线程正在运行 - 其中一个正在更新文件,另一个正在调用exit。该文件可能会损坏。因此,如果调用此方法,最佳实践规定关闭挂钩已编程为处理此类情况。这些钩子应该尝试关闭资源并进行其他类型的内务管理。

此外,也许这将有助于:一旦System.exit()被调用,那么继续执行它的代码将不会被执行。因此,如果你有一个scanner.close(),除非它处于关闭钩子中,否则它将不会被执行。当然,操作系统将释放进程出口上的文件描述符。

+0

这并不是一个很好的例子,因为一个文件可能会在完全单线程的程序中以这种方式变得'破坏',并且会关闭所有东西,退出钩子等。 – pvg

+0

我刚刚给出了一个最佳实践可能发生的例子没有被遵守。从来没有说过这是文件损坏的唯一方式。 :-) – Khanna111

+0

这实际上并不能说明为什么这些是“最佳实践”,因为它们实际上并不能阻止你声称他们预防了什么。 – pvg