私はかなりJavaに新しいです。私は現在、私にリアルタイムのテキストストリームを提供するURLからの入力を読んでいます。これをテキストファイルに続けて書きたいので、URLが新しい文字列を与えるたびに、これを文字列バッファに追加します。私の無限ループの外側で、バッファの内容をファイルに書き込みます。問題は、私はwhileループを終了する方法が必要なのです。なぜなら、サーバーはデータを与えることを止めることができないからです。コンソールに0を入力してwhileループを終了し、内容をファイルに書き込むなどです。その件に関して、誰かがStringBufferクラスのオブジェクトがストレージ制限に達するかどうかを知っていますか?ユーザー入力によって連続したwhileループを終了させるにはどうすればよいですか?
答えて
画像に「無限大」を表示すると、ある時点でYESのものがメモリ不足になります。
ループを終了するには、ループを別のスレッドで実行し、メインスレッドがユーザーの入力を待ち受けるようにします。入力に基づいて、メインスレッドは共有変数を変更します。通常は、終了を判断するブール値です。
比較的単純なループのように見える(と思われる)ために複数のスレッドを持たせることは、特にJavaにはまったく新しいと言って質問を始めた人にとっては、あまりにも複雑に思えます。 –
@Reece:私は答えを更新しましたが、あなたのコメントは少し失礼です。それをトーンダウンしようとする。ありがとう – bragboy
@Reece:あなた自身の研究を行い、独自のコードを書いてください。失礼する必要はありません。 –
break;
statmementを使用すると、最も内側のループから抜け出すことができます。 running
というブール値フィールドを作成することをお勧めします。ループの各反復は、それを確認してください。 falseの場合は、ループを終了します。
あるいはさらに効率しばらく条件としてブール値を使用して次のようになります。ユーザ入力に基づいて
/* Declaration */
public volatile boolean running = true;
/* Code */
running = true;
while (running)
{
}
、偽の上で実行されている旗を置きます。
あなたは、コンソールで何かを入力するとフラグがfalseに向ける作るために、このような何かを試みることができる:
new Thread("User Input Handler", new Runnable()
{
public void run()
{
try
{
System.in.read();
running = false;
} catch (Exception e) {}
}
}).start();
なぜ標準割り込みメカニズムを使用しないのですか?私のアンサーを参照してください。 –
あなたは蚊帳の外にジャンプする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 */
}
多くの人々(私自身が含まれています)は、 "構造化された"コードの概念を壊すことにより休憩を避けます。全体の "1つの入口、1つの出口"事。 –
ループは、インメモリバッファへの書き込みが、ファイルのライターに直接(BufferedWriterの内部でラップ)べきではありません。これにより、メモリ不足が回避されます。
whileループを実行する新しいスレッドを開始し、スレッドが自身に割り込むように要求された場合は、各繰り返しで、Thread.currentThread().isInterrupted()
を使用してテストする必要があります。中断されると、スレッドはwhileループを停止し、ライターを閉じます。
メインスレッドをコマンドラインから読み込み、stopコマンドを入力した場合は、ライタースレッドでinterrupt()
を呼び出します。
ありがとうございます。私はStringBufferを導入しました。なぜなら、サーバーが新しい文字列を与えるたびに、行単位でテキストファイルに書き込むと、直前の文字列が消去されるからです。 BufferedWriterを使用してより良い解決策を見つけ出すことができますか?また、マルチスレッドを使用せずにこれを行う方法はありますか? (私はまだ初心者です)私が現時点でやっていることは次のとおりです: do { response = connectionInputReader.readLine(); if(response!= null){ buffer.append(response); } } while(true); //内容を書き、ライターを閉じます。 ユーザーの介入をチェックする条件があるとは思っていましたか? – Reece
@JBニジェット:うーん、確かに。それは働く良い方法です。私はそれを覚えています。 +1 –
- 1. whileループが終了した後、次のステートメントを続行するにはどうすればよいですか?
- 2. ループが完了するたびに「while」ループを終了するかどうかをユーザーに尋ねるにはどうすればよいですか?
- 3. bool sentinel値を使ってC++でwhileループを終了するにはどうすればよいですか?
- 4. whileループの終了後にPythonプログラムを続けるにはどうすればよいですか?
- 5. whileループで入力を終了する
- 6. whileループを終了するにはどうすればいいですか?
- 7. キーを使用してWhile(真)ループを終了するにはどうすればよいですか?
- 8. 私はwhileループを使ってwhileループを使って終了しようとしています
- 9. 入力が完了したらスキャナを終了するにはどうすればよいですか?
- 10. 空白を入力してC++でWhileループを終了する
- 11. Cのキーストロークでwhileループを終了するにはどうすればよいですか?
- 12. Javaでwhileループを終了するにはどうすればよいですか?
- 13. このwhileループを終了するにはどうすればよいですか?
- 14. C++ - 移動するドットを連続してループさせるにはどうすればよいですか?
- 15. ループを終了するにはどうすればよいですか?
- 16. ループを終了するにはどうすればよいですか?
- 17. ユーザーがC++コンソールアプリケーションで「終了」を入力すると、アプリはどのように終了しますか?
- 18. Do-whileループはユーザー入力を待っていませんか?
- 19. 0を入力してプログラムを終了させるにはどうすればいいですか?
- 20. アプリがユーザーによって終了されたときは、どうすればわかりますか?
- 21. CTRL + Dを使用して入力を終了するにはどうすればよいですか?
- 22. do whileループで入力を一緒に追加するにはどうすればよいですか?
- 23. whileループで条件を書いて終了するにはどうすればいいですか?
- 24. このwhileループはどのように終了しますか? - ノードコード
- 25. ユーザーは「停止」という単語をどのように入力してコードを終了できますか?
- 26. ブレークを使用せずにC++でループを終了するにはどうすればよいですか?
- 27. 私はどのようにユーザー入力(JavaScript)でループを終了することができます
- 28. 終了するために "q"までユーザーが文字列を入力できるようにするループ
- 29. IRBセッションを終了せずにデバッガを終了するにはどうすればよいですか?
- 30. ユーザが 'q'または 'quit'を入力したときに私の小さなpythonプログラムを終了させるにはどうすればよいですか?
私はwhileループ内のテキストファイルへのレスポンスを書こうとしましたが、writerを閉じることなく正常に実行できないため、whileループの外側にそのコマンドを移動しました。私は入力を読むためにwhile条件を編集しようとしましたが、特定の入力が与えられたときに中断しましたが、これは条件をテストするために入力を継続的に入力する必要があります。私はちょうど何かを押すことなくストリームを実行したままにしておき、入力を提供することで中断したい。私ができる特別なチェックは何ですか? – Reece
JB Nizetの答えを見てください。それはあなたが見つける可能性があるほど簡単です。マルチスレッドは最小限に抑えられます。何かのように:スレッドの背景=新しいThead(){doStuff(); }; background.start(); System.in.readLine(); background.interrupt(); –