【问题标题】:How do I exit a continuous while loop by some user input?如何通过某些用户输入退出连续的 while 循环?
【发布时间】:2012-01-24 12:07:58
【问题描述】:

我对 Java 还是很陌生。我目前正在从一个为我提供实时文本流的 URL 读取输入。我想不断地将它写入一个文本文件,所以每次 URL 给出一个新字符串时,我都会将它添加到一个字符串缓冲区,在我的无限 while 循环之外,我将缓冲区的内容写入我的文件。问题是,我需要一种退出 while 循环的方法,因为服务器永远不会停止给我数据,所以我想做一些事情,比如在控制台中输入 0 以退出 while 循环并将内容写入文件。关于这个问题,有人知道我的 StringBuffer 类对象是否会达到存储限制吗?

【问题讨论】:

  • 好吧,我尝试将响应写入 while 循环内的文本文件,但如果不关闭编写器,我无法成功执行此操作,因此我已将该命令移到 while 循环之外。我尝试编辑 while 条件以读取输入并在给出特定输入时中断,但这需要我不断输入输入以测试条件。我只想让流运行而不必按任何东西,然后通过提供输入来中断。我可以做任何特定的检查吗?
  • 见 JB Nizet 的回答。它与您可能会发现的一样简单。多线程将是最小的。类似于:线程背景 = new Thead() { doStuff(); };背景.开始(); System.in.readLine();背景.interrupt();

标签: java io


【解决方案1】:

当您将“无限”带入画面时,是的,某些事情会在某个时候耗尽内存。

要退出循环,您可以让它在单独的线程中运行,并让主线程监听用户输入。并且根据输入,主线程将改变一个共享变量,通常是一个布尔值来确定结束。

【讨论】:

  • 为(看起来像)一个相对微不足道的循环引入多个线程似乎过于复杂,尤其是对于那些说自己对 Java 很陌生的人来说。
  • @Reece:我已经更新了答案,但你的 cmets 有点粗鲁。试着把它调低。谢谢
  • @Reece:做你自己的研究并编写你自己的代码。没有必要粗鲁。
  • @Reece 侮辱他人并不是鼓励他们(或其他人)通过回答您的问题来帮助您的最佳方式。没有硬性限制,这完全取决于 Java 可以使用的内存以及它用于除 StringBuffer 实例之外的所有内容的内存量。
  • 我读到“当您将“无限”带入画面时,是的,某些事情会在某个时候耗尽内存。”并没有看到下面的内容,所以我认为您只是故意无济于事。我的错,道歉。没有多线程有没有办法做到这一点?
【解决方案2】:

使用break; 语句,您可以跳出最内层的循环。我建议创建一个名为running 的布尔字段。循环的每次迭代,检查它。如果为 false,则退出循环。

或者更有效的方法是使用布尔值作为while条件:

/* Declaration */
public volatile boolean running = true;

/* Code */
running = true;
while (running)
{


}

根据用户输入,将运行标志设置为 false。

当您在控制台中键入内容时,您可以尝试这样的方法使标志变为 false:

new Thread("User Input Handler", new Runnable()
{
    public void run()
    {
        try
        {
            System.in.read();
            running = false;
        } catch (Exception e) {}
    }
}).start();

【讨论】:

  • 为什么不使用标准的中断机制呢?看我的分析器。
【解决方案3】:

您可以使用break; 语句跳出循环。您需要做的是检查您读入的输入与您希望停止条件的任何内容,如果它们匹配,则调用break;。像这样的:

while(true) {
    String input = /* read input */;
    if("0".equals(input)
        break;
    /* whatever you want to do if you haven't hit your stopping condition */
}

【讨论】:

  • 许多人(包括我自己)避免中断,因为它破坏了“结构化”代码概念。整个“一进一出”的事情。
【解决方案4】:

循环不应该写入内存缓冲区,而是直接写入文件写入器(包装在 BufferedWriter 中)。这样可以避免内存不足。

您应该启动一个执行您的 while 循环的新线程,并在每次迭代时使用Thread.currentThread().isInterrupted() 测试线程是否被要求中断自身。一旦中断,线程应该停止 while 循环,并关闭编写器。

让你的主线程从命令行读取,当输入停止命令时,在写入线程上调用interrupt()

【讨论】:

  • 谢谢。我引入了一个 StringBuffer ,因为当服务器逐行写入文本文件时,服务器给了我一个新字符串,只是删除了前一个字符串。如果这是一个更好的解决方案,您能否详细说明使用 BufferedWriter?另外,有没有办法在不使用多线程的情况下做到这一点? (我还是个新手)我现在做的是:do { response = connectionInputReader.readLine(); if (response != null) { buffer.append(response); } } 而(真); // 写入内容并关闭 writer。我想也许有一段时间会检查用户干预?
  • @JB Nizet:嗯,确实。这是一种很好的工作方式。我会记住的。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2014-04-12
  • 1970-01-01
  • 2014-08-02
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多