我有几个主题。每个线程都有一个while(true)循环,我在其中添加逐周期文本。我没有找到一个很好的方法来改变带有标志的while(true)循环,这样我可以在循环时关闭文件。我想在输入内容时或者按下Eclipse红色按钮时这样做。
这是构造函数(节点是一个线程)
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();
}
}
这是我修改文件的循环:
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 void closeCSVs() {
try {
writer.close();
writer2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
如果我正确地理解了您的问题,那么您正在寻找的是资源尝试块,其效果如下:
try(FileReader reader = new FileReader("path")) {
while(true) {
//use resources
}
}
您可以将它与任何实现AutoClosable-Interface的类(基本上每个提供.close()方法的类)一起使用。 在转义try-block后,资源将自动关闭。
相同的解决方案不同的代码将用经典的try包装并向其添加finally块。
try {
FileReader reader = new FileReader("path");
while(true) {
//use resources
}
} finally {
reader.close();
}
答案 1 :(得分:0)
您可能需要在关闭挂钩Runtime.addShutdownHook
中实现关闭文件