gpt4 book ai didi

java - 在 Java 中是否可以在关闭后重新打开 System.in

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:01 26 4
gpt4 key购买 nike

我有一个多线程控制台应用程序,它从两个不同的来源获取输入。一个是用户在控制台中输入,另一个是网络。我使用 BufferedReader.readline() 从用户那里获取输入并阻止它,这很好,除非我在等待时收到网络输入。在这种情况下,我需要通过取消 readline() 来解除对用户线程的阻塞。

我认为取消它的最佳方法是关闭 System.in 并使 readline() 抛出异常。在那之后,我需要重新打开它。这可能吗?

最佳答案

无法重新打开 System.inSystem.outSystem.err。底层 native 流是连接到其他进程或连接到您的应用程序无法识别其身份的文件的文件描述符。一旦底层 native 文件描述符被关闭,就不可能重新打开它们。

我能建议的最好的办法是为 System.in 对象创建一个包装器 InputStream 类,然后编写包装器来处理 close() 作为空操作。或者可能将包装器设置为“关闭”状态而不实际关闭包装流。

在您的特定用例中,这将不起作用,因为您“需要”解除阻塞在从 System.in 读取时被阻塞的线程。因此,在您的情况下,您需要从 System.in 执行非阻塞输入。例如,使用 available() 方法来测试是否有任何字符可以从控制台读取。 (通常可以安全地假设如果 available() 返回一个大于零的数字,您将能够读取整行。)

(它也可以使用 Selector 实现非阻塞读取,但我认为不可能为 System.在对象中。)


请注意,Thread.interrupt() 将不起作用。根据 javadocs,只有当您从可中断的 channel 阅读时,它才会起作用。

  • System.in 不是可中断的 channel ,并且

  • 如果是,则记录在案的 interrupt() 行为是 channel 被中断关闭。

关于java - 在 Java 中是否可以在关闭后重新打开 System.in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27286690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com