任何人都可以解释ProcessBuilder
和FileHandler
之间的区别,在哪种情况下应该使用哪一个。
例如,如果我们要将命令的输出重定向到文本文件“ logfile.txt ”,ProcessBuilder
需要几秒钟才能将输出输出到文件。
这个FileHandler
在100个进程的情况下可以做什么,必须将它们的输出发送到相同的“ logfile.txt ”?
有没有办法在process.waitFor()
中不使用ProcessBuilder
方法将所有100条记录输出到相同的“ logfile.txt ”?这是我的代码,但是如果同时安排了100条记录,那么p.waitfor()方法将无法帮助我,因为执行命令需要几秒钟,并且为每个进程输出到logfile,对于100个进程意味着需要更多时间为DB中的所有记录执行相同的命令。但我的申请将每分钟开始。多数问题,process.waitFor()帮助我获得精确的输出,但更多的记录意味着它需要更多的时间。我想要另一种方法,它不应该等待,但所有输出都应该同步附加到文件中。
while(rs1.next())
{
instance_id = rs1.getString(1);
startdate = rs1.getString(2);
starttime = rs1.getString(3);
endtime = rs1.getString(4);
enddate = rs1.getString(5);
if(presentdate.equals(startdate) || presentdate.equals(enddate))
{
if(presenttime.equals(starttime))
{
String[] s1 = new String[]{"cmd", "/c","ec2-start-instances",instance_id,">>","D:\\logfile.log"};
ProcessBuilder builder1 = new ProcessBuilder(s1);
Process p1 = builder1.start();
p1.waitFor();
}
else if(presenttime.equals(endtime))
{
String[] s1 = new String[]{"cmd", "/c","ec2-stop-instances",instance_id,">>","D:\\logfile.log"};
ProcessBuilder builder1 = new ProcessBuilder(s1);
Process p1 = builder1.start();
p1.waitFor();
}
}
}
答案 0 :(得分:0)
对于ProcessBuilder
根据文档:
请注意,此类未同步。如果多个线程访问a ProcessBuilder实例并发,并且至少有一个线程 从结构上修改其中一个属性,必须同步 外部
示例强>
处理p =新的ProcessBuilder(" myCommand"," myArg")。start();
据我了解,ProcessBuilder
用于与操作系统上的其他软件进行通信。 (可能是外部日志记录脚本或某种形式的日志记录软件)
FileHandler
是一个标准的文件记录系统。但是,为了避免多次调用的问题,请使您的日志记录代码保持静态,以确保在调用它完成它的进程时。 FileHandler
默认刷新(根据文档)。
希望有所帮助
答案 1 :(得分:0)
它们是两个主要不相关的物体和区域。
是的,Process Builder为我们提供了一个标准输出和错误输出流,可以将其保存到文件中,但也可以保存到数据库中或丢弃。
另一方面,ava.util.logging.FileHandler是日志记录系统的附件部分。我们通常使用日志来记录我们自己的代码,但是记录我们在那里调用的外部进程的输出也没有错。但是如果其他类在进程记录时记录,那么将会混淆日志。
同样,如果您运行50个进程,我建议您不要登录到同一个文件。但是使用50个线程登录到50个不同的文件。每个线程都会检查eroror和输出流,并在有新流或该流的结束时保存。
完成所有操作后,可以复制到日志文件或首选的新文件.T
答案 2 :(得分:0)
发布代码实际上可以更好地了解正在发生的事情。现在我看到你正在使用windows cmd.exe
重定向功能,而不是使用java从生成的进程中读取输出并使用它们执行某些操作。
如果您喜欢任何不同的行为,您必须:
new String[]{"ec2-start-instances",instance_id)
processBuilder.redirectErrorStream(true)
process.getOutputStream().close()
现在#4和#5并非微不足道,但互联网上有大量信息如何实现。在Java 7中,您还可以选择在没有任何代码的情况下重定向到文件 - processBuilder.redirectOutput(File file)
,但我认为它不是线程安全的,因此您的多个进程不能很好地相互协作。
以下两个问题给出了一些如何实现#4和#5的例子: