ProcessBuilder和FileHandler之间的区别

时间:2014-06-17 13:06:46

标签: java processbuilder filehandler

任何人都可以解释ProcessBuilderFileHandler之间的区别,在哪种情况下应该使用哪一个。

例如,如果我们要将命令的输出重定向到文本文件“ 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();
            }
        }
    }

3 个答案:

答案 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从生成的进程中读取输出并使用它们执行某些操作。 如果您喜欢任何不同的行为,您必须:

  1. 如果可能的话,执行没有cmd.exe的进程(以避免缓冲) - new String[]{"ec2-start-instances",instance_id)
  2. 合并进程stdout和stderr(更容易捕获所有输出)processBuilder.redirectErrorStream(true)
  3. 关闭进程stdin(只是一个预防措施) - process.getOutputStream().close()
  4. 生成线程以读取所有并发进程的输出流
  5. 让这些线程以线程安全的方式将他们正在读取的内容写入文件
  6. 现在#4和#5并非微不足道,但互联网上有大量信息如何实现。在Java 7中,您还可以选择在没有任何代码的情况下重定向到文件 - processBuilder.redirectOutput(File file),但我认为它不是线程安全的,因此您的多个进程不能很好地相互协作。

    以下两个问题给出了一些如何实现#4和#5的例子: