1

第一次申请

Swing 客户端:此客户端将 A URI 作为输入。提供的 URI 是 Web 服务的 URL。提交时,客户端以 URI 作为参数执行 WebService 客户端。

为了执行 web 服务客户端,

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

由于 jar 是由客户端提供的,并且除了接受 requestURI 的 main 方法之外没有公共方法。

第二次申请

WebService 客户端:这是用于调用托管在服务器中的 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;
    }

问题

当我通过终端或 Windows 命令行执行命令 java -jar EncryptToken.jar http://example.org/GCWS/YesWS时。

命令执行成功,控制台输出写入文件,文件大小在 70-90 KB 之间变化。

但是,当我尝试使用 Swing Client 执行相同的操作时,会执行命令,但日志文件首先初始化为 1KB,然后变为 5KB,然后冻结。5 KB 日志包含未终止的 xml。当我关闭 Swing 客户端时,控制台输出的其余部分将附加到日志文件中。

我没有在 Swing Client 中读取或写入文件。Swing Client 中没有 System.out 或 System.err 语句。

我无法找出确切的根本原因。请帮忙。

4

1 回答 1

0

确保所有输出流和文件都已关闭。

这些流用作缓冲区。如果你写它们,它并没有真正写入磁盘,除非:

  • 内存队列已满(大约几千字节)
  • 您在流上调用 flush() 以强制将其写出
  • 您关闭流(这也会强制写出所有待处理的数据)

当 JVM 停止时,它会尝试关闭所有东西,这就是它似乎在命令行中工作的原因。从 Swing 应用程序启动时,JVM 不会停止,直到您停止 Swing 应用程序,因此文件的某些部分似乎没有写入磁盘。

于 2016-02-24T17:53:58.707 回答