如何通过某些用户输入退出连续的while循环?

时间:2011-12-20 14:27:18

标签: java io

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

4 个答案:

答案 0 :(得分:2)

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

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

从命令行读取主线程,并在输入stop命令时,在编写器线程上调用interrupt()

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用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 :(得分:0)

您可以使用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 */
}