2017-02-03 22 views
0

私はいくつかのスレッドを持っています。各スレッドにはwhile(true)ループがあり、ここでサイクルごとのテキストを追加します。私は、while(true)ループをフラグで変更する良い方法が見つからないので、サイクルから出てくるときにファイルを閉じることができます。たとえば、何かを入力するときや、Eclipseの赤いボタンを押したときに、これをしたいと思います。キーボード入力でwhileループの実行を停止するにはどうしたらいいですか?

while (true) { 
     //write id value 
     String id_to_split = num+"#"+fsm.current_state.nome+"#"+tempo_minore+"#"+ 
       fsm.current_transition.e.getId()+"#"+ fsm.current_transition.c.getId()+"#"+ 
       fsm.current_transition.c.getFlag()+"#"+fsm.current_transition.a.getId()+"#"+ 
       fsm.current_transition.a2.getId()+"#"+backoff; 

     String[] id_entries = id_to_split.split("#"); 
     writer.writeNext(id_entries); 

     //write name 
     String label_to_split = num+"#"+fsm.current_state.nome+"#"+tempo_minore+"#"+ 
       fsm.current_transition.e.getLabel()+"#"+fsm.current_transition.c.getLabel()+"#"+ 
       fsm.current_transition.c.getFlag()+"#"+fsm.current_transition.a.getLabel()+"#"+ 
       fsm.current_transition.a2.getLabel()+"#"+backoff; 

     String[] label_entries = label_to_split.split("#"); 

     writer2.writeNext(label_entries); 

     num++; 
} 
    closeCSVs(); 
} 

方法closeCSVs():

これはコンストラクタである

public Node(Channel c, int address) { 
    my_address=address; 
    try { 
     writer = new CSVWriter(new FileWriter(my_address + "_id.csv"), ',', ' ' , ' ' ,"\n"); 
     writer2 = new CSVWriter(new FileWriter(my_address + "_label.csv"), ',', ' ' , ' ' ,"\n"); 
     String[] entries = "num#state#duration#event#condition#condition result#action1#action2#backoff value".split("#"); 
     writer.writeNext(entries); 
     writer2.writeNext(entries); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

これは私がファイルを修正するループである(ノードはスレッドです)

public void closeCSVs() { 
    try { 
     writer.close(); 
     writer2.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+1

で閉じたファイルを実装する必要があります。 –

+0

ループの後にファイルを閉じ、特定の条件が満たされるたびにループを解除する方法はありますか?どのような状態が確認され、どのようにあなた次第ですか。私はまた、ファイルストリームをコンストラクタ(スレッドの?)ではなく、ループに入る前に開くこともできます。 – Thomas

+0

あなたが望むようにコードを修正するには、変更する必要があります。 –

答えて

2

私が正しくあなたの質問を理解している場合、あなたが探していることは、次のように動作しますいずれかのtry-と資源ブロックである:

try(FileReader reader = new FileReader("path")) { 
    while(true) { 
     //use resources 
    } 
} 

あなたは基本的にAutoClosable・インタフェースを(実装するすべてのクラスでこれを使用することができます.close() - メソッドを提供するすべてのクラス。 リソースは、try-blockがエスケープされた後に自動的に閉じられます。

同じ解決策のコードは、古典的なtryでラップしてfinallyブロックを追加することです。

try { 
    FileReader reader = new FileReader("path"); 
    while(true) { 
     //use resources 
    } 
} finally { 
    reader.close(); 
} 
+1

コードの最初のビットは、最後にFileReaderを追加して閉じることをお勧めします。 –

+0

@TotumusMaximus、試着リソースは 'AutoClosable'であるのでそれを行います – AxelH

+0

あなたは正しいです。私は古典的なtry-catchを好むだろう。最終的にリソースを試してみるのは、読めるようになると思っているし、I/Oでうまくいくことがわかったからだ。それが一般的に真実であるかどうかは分かりません。 – matejetz