Последствия попытки убить программу перед закрытием OutputStreamWriter
Это часть большой графической программы (особенно JavaPlot). В скорлупе ореха я бы попытался что-то нарисовать; график появится в
out.write(comms);
но затем закройте, как только он ударил
out.close()
Я знаю, что вам нужно закрыть OutputStreamWriter, поэтому вместо удаления этой строки я создал сканер, который ожидает, пока пользователь не нажмет "Q", а затем программа продолжит работу в обычном режиме, закроет график, OutputStreamWriter и сканер.
OutputStreamWriter out = new OutputStreamWriter(proc.getOutputStream());
out.write(comms);
out.flush();
//added from here
//waiting until input is given
Scanner timeKiller = new Scanner(System.in);
String check = timeKiller.nextLine();
if(check != "q"){
check = timeKiller.nextLine(); //<---waiting here.
}
timeKiller.close();
//to here
out.close();
Что я делаю опасно? Если кто-то закроет график, закрыв окно, это не убьет программу, правильно? Это не приведет к утечке памяти (верно?), Но если процесс все еще выполняется и они запускают эту программу несколько раз, это в конечном итоге станет проблемой. Как я могу это исправить? Может быть, добавьте слушателя к окну, которое прерывает цикл, если окно закрыто? Или я ошибаюсь, и это вообще не проблема?
2 ответа
Если вы сбросили поток / запись после самой последней записи, вы не потеряете данные, если выйдете из приложения без вызова close
в потоке первым. И если вы выходите из приложения, JVM завершается, и утечки памяти становятся неактуальными.
С другой стороны, если вы не заставляете приложение закрываться, когда оно, вероятно, должно завершиться, и в результате пользователь порождает несколько экземпляров, у вас будет проблема с большим количеством JVM, заполняющих память ПК пользователя. Если это произойдет, гипотетический поток утечек будет незначительным по сравнению с работой с потерянными JVM.
Но из вашего вопроса действительно неясно, что вы на самом деле делаете и / или предлагаете делать, поэтому я не могу прокомментировать вашу конкретную ситуацию.
В окне есть setDefaultCloseOperation, которое вы можете установить в EXIT_ON_CLOSE, что будет делать System.exit(0).