Swing应用程序阻止写入文件

时间:2014-07-22 09:29:59

标签: java swing logging tee swing-app-framework

第一次申请

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

执行webservice客户端

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执行相同操作时,执行Command但是日志文件首先用1KB初始化,然后它变为5KB然后冻结。 5 KB日志包含未终止的xml。当我关闭swing客户端时,控制台输出的其余部分将附加到日志文件中。

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

我无法弄清楚exect的根本原因。请帮忙。

1 个答案:

答案 0 :(得分:0)

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

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

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

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