第一个应用程序
Swing客户端:此客户端将URI作为输入。提供的URI是Web服务的URL。提交时,客户端执行以URI为参数的WebService客户端。
用于执行Web服务客户端
String command = "java -jar EncryptToken.jar " + requestURI;
Runtime.getRuntime().exec(command);
由于jar是由客户端提供的,除了接受requestURI的main方法外,没有其他公共方法。
第二次应用
WebService客户端:这是用于调用服务器中托管的WebService的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-90KB之间变化。
但是,当我尝试用Swing Client执行同样的操作时,命令会被执行,但日志文件首先用1KB初始化,然后变为5KB,然后被冻结。5 KB的日志包含未终止的xml。当我关闭swing客户端时,控制台输出的其余部分将附加到日志文件中。
我没有在Swing Client中读取或写入该文件。Swing Client中没有System.out或System.err语句。
我无法找出高管的根本原因。请帮忙。
确保所有输出流和文件都已关闭。
这些流充当缓冲区。如果你写它们,它并没有真正写入磁盘,除非:
- 内存中的队列已满(大约有几千字节(
- 对流调用flush((以强制将其写出
- 关闭流(这也会强制写出所有挂起的数据(
当JVM停止时,它会尝试关闭所有填充,这就是为什么它似乎在命令行中工作。从swing应用程序启动时,JVM直到停止swing应用才会停止,因此文件的某些部分似乎没有写入磁盘。