Приложение Swing мешает записать файл
1-е приложение
Swing Client: этот клиент принимает URI в качестве входных данных. И предоставленный URI является URL-адресом веб-службы. При отправке клиент выполняет клиент WebService с URI в качестве параметра.
Для выполнения клиента веб-сервиса,
String command = "java -jar EncryptToken.jar " + requestURI;
Runtime.getRuntime().exec(command);
Поскольку jar предоставляется клиентом и не имеет публичного метода, кроме основного, который принимает requestURI.
2-е приложение
Клиент WebService: это клиент веб-службы, который используется для вызова веб-службы, размещенной на сервере.
В декомпилированном коде я обнаружил приведенный ниже код для регистрации выходных данных консоли в файле регистратора.
OutputStream outStream = System.out;
try{
OutputStream os = new FileOutputStream("EncryptToken.log", false); // only the file output stream
TeeOutputStream tos = new TeeOutputStream(outStream, os); // create a TeeOutputStream that duplicates data to outStream and os
PrintStream fileStream = new PrintStream(tos);
System.setErr(fileStream);
System.setOut(fileStream);
}catch(FileNotFoundException ex){
out.println("[Golden Client] Log file create Exception = " + ex.toString());
return false;
}
Вопрос
Когда я выполняю команду java -jar EncryptToken.jar http://example.org/GCWS/YesWS через терминал или командную строку Windows.
Команда выполнена успешно, и консольный вывод записывается в файл, а размер файла варьируется от 70 до 90 КБ.
Но когда я пытаюсь выполнить то же самое с клиентом Swing, команда выполняется, но файл журнала сначала инициализируется с 1 КБ, затем он переходит к 5 КБ, а затем останавливается. Журнал 5 КБ содержит неопределенный XML. Когда я закрываю свинг-клиент, остальные выходные данные консоли добавляются в файл журнала.
Я не читаю и не пишу файл в Swing Client. В клиенте Swing нет ни System.out, ни System.err.
Я не могу выяснить причину причины. Пожалуйста помоги.
1 ответ
Убедитесь, что все выходные потоки и файл закрыты.
Эти потоки работают как буфер. Если вы записываете их, они не записываются на диск, если только:
- очередь в памяти заполнена (около нескольких килобайт)
- вы вызываете flush() в потоке, чтобы заставить его записать
- Вы закрываете поток (что также вынуждает записывать все ожидающие данные)
Когда JVM останавливается, он пытается закрыть все элементы, поэтому он работает в командной строке. При запуске из приложения Swing JVM не останавливается, пока вы не остановите приложение Swing, поэтому кажется, что некоторая часть файла не записана на диск.