Приложение 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, поэтому кажется, что некоторая часть файла не записана на диск.

Другие вопросы по тегам