请您解释一下ProcessBuilder和FileHandler之间的区别,在哪种情况下应该使用哪一种。
例如,如果我们想将命令的输出重定向到文本文件(比如"logfile.txt“),那么ProcessBuilder需要几秒钟才能将输出转到文件中。
在100个进程必须将它们的输出发送到相同的“FileHandler”的情况下,这个logfile.txt可以做什么?
有没有办法在不使用logfile.txt中使用process.waitFor()方法的情况下将所有100条记录输出到同一个“ProcessBuilder”?这是我的代码,但是如果同时调度100条记录,那么p.waitfor()方法将不会对我有所帮助,因为执行命令和将输出输出到日志文件只需几秒钟,对于每个进程来说,这意味着对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();
}
}
}发布于 2014-06-17 13:20:35
对于ProcessBuilder,根据文档:
注意,这个类不是同步的。如果多个线程同时访问ProcessBuilder实例,并且至少有一个线程在结构上修改其中一个属性,则必须在外部同步它。
示例
Process p= new ProcessBuilder("myCommand","myArg").start();
据我所知,ProcessBuilder用于与操作系统上的其他软件进行通信。(可以是外部日志脚本或某种形式的日志记录软件)
FileHandler更像是一个标准的文件日志系统。但是,为了避免多个调用产生的问题,将日志代码静态化,以确保它在被调用时完成了它的进程。默认情况下,FileHandler会刷新(根据文档)。
希望这对我们有一点帮助
发布于 2014-06-17 13:42:11
它们是两个基本不相关的物体和区域。
是的,Process为我们提供了一个标准的输出和错误输出流,可以保存到文件中,但也可以保存到数据库或丢弃。
另一方面,ava.util.logging.FileHandler是日志记录系统的一个应用程序部分。我们通常在自己的代码中使用日志记录,但是记录外部进程的输出也没有什么问题。
但是,如果进程正在进行日志记录时,其他类会记录日志,那么就会混淆日志。
同样,如果您运行50个进程,我建议您不要登录到同一个文件。但登录到50个不同的文件-使用50个线程。每个线程将检查eroror和输出流,并在有新行或该流的末尾时保存。
当一切完成后,可以复制到日志文件或一个新的文件,如
发布于 2014-06-24 10:54:57
张贴您的代码实际上给了更多的了解是怎么回事。现在,我看到您正在使用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的例子:
https://stackoverflow.com/questions/24264659
复制相似问题