1

1次申請

Swing Client : このクライアントは URI を入力として受け取ります。また、提供された URI は Web サービスの URL です。送信時に、クライアントは URI をパラメーターとして使用して WebService Client を実行します。

Webサービスクライアントを実行するには、

String command = "java -jar EncryptToken.jar " + requestURI;
Runtime.getRuntime().exec(command);

jar はクライアントによって提供され、requestURI を受け入れる main メソッド以外の public メソッドはありません。

2次申請

WebService Client : これは、サーバーでホストされている Web サービスを呼び出すために使用される Web サービス クライアントです。

逆コンパイルされたコードで、コンソール出力をロガー ファイルに記録するための以下のコードを見つけました。

    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 KB の間で変化します。

しかし、Swing Client で同じことを実行しようとすると、コマンドは実行されますが、ログ ファイルは最初に 1KB で初期化され、次に 5KB になり、その後フリーズします。5 KB のログには、終了していない xml が含まれています。Swing クライアントを閉じると、残りのコンソール出力がログ ファイルに追加されます。

Swing クライアントでファイルを読み書きしていません。Swing クライアントには System.out または System.err ステートメントはありません。

根本的な原因を突き止めることができません。助けてください。

4

1 に答える 1

0

すべての出力ストリームとファイルが閉じていることを確認してください。

これらのストリームはバッファとして機能します。それらを書き込んでも、次の場合を除き、実際にはディスクに書き込まれません。

  • メモリ内キューがいっぱいです (約数キロバイトのように)
  • ストリームで flush() を呼び出して、強制的に書き出す
  • ストリームを閉じます (これにより、保留中のすべてのデータが強制的に書き出されます)

JVM が停止すると、すべてのものを閉じようとするため、コマンド ラインで動作しているように見えます。swing アプリから起動した場合、swing アプリを停止するまで JVM が停止しないため、ファイルの一部がディスクに書き込まれていないように見えます。

于 2016-02-24T17:53:58.707 に答える