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