[英]Difference between ProcessBuilder and FileHandler
谁能解释一下ProcessBuilder
和FileHandler
之间的区别,在这种情况下应该使用哪一种。
例如,如果我们要将命令的输出重定向到文本文件“ logfile.txt ”,则ProcessBuilder
需要花费几秒钟的时间将输出输出到文件。
在100个进程必须将其输出发送到相同的“ logfile.txt ”的情况下,此FileHandler
可以做什么?
有没有一种方法可以在不使用ProcessBuilder
process.waitFor()
方法的情况下将所有一百条记录的输出输出到相同的“ logfile.txt ”? 这是我的代码,但是如果同时安排了100条记录,那么p.waitfor()方法将无济于事,因为执行命令并为每个进程和100个进程获取输出到日志文件需要几秒钟的时间,这将花费更多时间是时候对数据库中的所有记录执行相同的命令了。 但我的应用程序将每分钟启动一次。 就是这个问题,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();
}
}
}
对于ProcessBuilder
根据文档:
请注意,此类未同步。 如果多个线程同时访问ProcessBuilder实例,并且至少有一个线程在结构上修改了其中一个属性,则必须在外部对其进行同步。
例
进程p = new ProcessBuilder(“ myCommand”,“ myArg”)。start();
据我了解, ProcessBuilder
用于与OS上的其他软件进行通信。 (这可能是外部日志记录脚本或某种形式的日志记录软件)
FileHandler
更像是一个标准的文件记录系统。 但是,为了避免多次调用带来的问题,请使您的日志记录代码静态,以确保在调用它时完成处理过程。 FileHandler
默认情况下刷新(根据文档)。
希望能有所帮助
它们是两个最不相关的对象和区域。
是的,Process Builder为我们提供了标准的输出和错误输出流,可以将其保存到文件中,但也可以保存到数据库中或丢弃。
另一方面,ava.util.logging.FileHandler是日志记录系统的附加部分。 我们通常使用日志记录自己的代码,尽管记录在其中调用的外部流程的输出也没错。
但是,如果其他类在进程正在记录日志的同时进行日志记录,则将得到混淆的日志。
同样,如果您正在运行50个进程,我建议您不要登录到同一文件。 但是使用50个线程记录到50个不同的文件。 每个线程都会检查错误和输出流,并在有新行或流的末尾时保存。
完成所有操作后,可以复制到日志文件或作为首选文件复制到新文件。
实际上,发布代码可以使您更多地了解发生了什么。 现在,我看到您正在使用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的示例:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.