2011-12-20 7 views
-3

私はかなりJavaに新しいです。私は現在、私にリアルタイムのテキストストリームを提供するURLからの入力を読んでいます。これをテキストファイルに続けて書きたいので、URLが新しい文字列を与えるたびに、これを文字列バッファに追加します。私の無限ループの外側で、バッファの内容をファイルに書き込みます。問題は、私はwhileループを終了する方法が必要なのです。なぜなら、サーバーはデータを与えることを止めることができないからです。コンソールに0を入力してwhileループを終了し、内容をファイルに書き込むなどです。その件に関して、誰かがStringBufferクラスのオブジェクトがストレージ制限に達するかどうかを知っていますか?ユーザー入力によって連続したwhileループを終了させるにはどうすればよいですか?

+0

私はwhileループ内のテキストファイルへのレスポンスを書こうとしましたが、writerを閉じることなく正常に実行できないため、whileループの外側にそのコマンドを移動しました。私は入力を読むためにwhile条件を編集しようとしましたが、特定の入力が与えられたときに中断しましたが、これは条件をテストするために入力を継続的に入力する必要があります。私はちょうど何かを押すことなくストリームを実行したままにしておき、入力を提供することで中断したい。私ができる特別なチェックは何ですか? – Reece

+0

JB Nizetの答えを見てください。それはあなたが見つける可能性があるほど簡単です。マルチスレッドは最小限に抑えられます。何かのように:スレッドの背景=新しいThead(){doStuff(); }; background.start(); System.in.readLine(); background.interrupt(); –

答えて

0

画像に「無限大」を表示すると、ある時点でYESのものがメモリ不足になります。

ループを終了するには、ループを別のスレッドで実行し、メインスレッドがユーザーの入力を待ち受けるようにします。入力に基づいて、メインスレッドは共有変数を変更します。通常は、終了を判断するブール値です。

+0

比較的単純なループのように見える(と思われる)ために複数のスレッドを持たせることは、特にJavaにはまったく新しいと言って質問を始めた人にとっては、あまりにも複雑に思えます。 –

+0

@Reece:私は答えを更新しましたが、あなたのコメントは少し失礼です。それをトーンダウンしようとする。ありがとう – bragboy

+0

@Reece:あなた自身の研究を行い、独自のコードを書いてください。失礼する必要はありません。 –

0

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(); 
+0

なぜ標準割り込みメカニズムを使用しないのですか?私のアンサーを参照してください。 –

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 */ 
} 
+0

多くの人々(私自身が含まれています)は、 "構造化された"コードの概念を壊すことにより休憩を避けます。全体の "1つの入口、1つの出口"事。 –

2

ループは、インメモリバッファへの書き込みが、ファイルのライターに直接(BufferedWriterの内部でラップ)べきではありません。これにより、メモリ不足が回避されます。

whileループを実行する新しいスレッドを開始し、スレッドが自身に割り込むように要求された場合は、各繰り返しで、Thread.currentThread().isInterrupted()を使用してテストする必要があります。中断されると、スレッドはwhileループを停止し、ライターを閉じます。

メインスレッドをコマンドラインから読み込み、stopコマンドを入力した場合は、ライタースレッドでinterrupt()を呼び出します。

+0

ありがとうございます。私はStringBufferを導入しました。なぜなら、サーバーが新しい文字列を与えるたびに、行単位でテキストファイルに書き込むと、直前の文字列が消去されるからです。 BufferedWriterを使用してより良い解決策を見つけ出すことができますか?また、マルチスレッドを使用せずにこれを行う方法はありますか? (私はまだ初心者です)私が現時点でやっていることは次のとおりです: do { response = connectionInputReader.readLine(); if(response!= null){ buffer.append(response); } } while(true); //内容を書き、ライターを閉じます。 ユーザーの介入をチェックする条件があるとは思っていましたか? – Reece

+0

@JBニジェット:うーん、確かに。それは働く良い方法です。私はそれを覚えています。 +1 –

関連する問題