首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ProcessBuilder与FileHandler的区别

ProcessBuilder与FileHandler的区别
EN

Stack Overflow用户
提问于 2014-06-17 13:06:45
回答 3查看 327关注 0票数 1

请您解释一下ProcessBuilderFileHandler之间的区别,在哪种情况下应该使用哪一种。

例如,如果我们想将命令的输出重定向到文本文件(比如"logfile.txt“),那么ProcessBuilder需要几秒钟才能将输出转到文件中。

在100个进程必须将它们的输出发送到相同的“FileHandler”的情况下,这个logfile.txt可以做什么?

有没有办法在不使用logfile.txt中使用process.waitFor()方法的情况下将所有100条记录输出到同一个“ProcessBuilder”?这是我的代码,但是如果同时调度100条记录,那么p.waitfor()方法将不会对我有所帮助,因为执行命令和将输出输出到日志文件只需几秒钟,对于每个进程来说,这意味着对DB中的所有记录执行相同的命令需要更多的时间。但我的申请每分钟都会开始。这就是问题所在,process.waitFor()帮助我获得准确的输出,但是对于更多的记录意味着需要更多的时间。我想要另一个方法,它不应该等待,但是所有的输出都应该同步地附加到文件中。

代码语言:javascript
复制
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();
            }
        }
    }
EN

回答 3

Stack Overflow用户

发布于 2014-06-17 13:20:35

对于ProcessBuilder,根据文档:

注意,这个类不是同步的。如果多个线程同时访问ProcessBuilder实例,并且至少有一个线程在结构上修改其中一个属性,则必须在外部同步它。

示例

Process p= new ProcessBuilder("myCommand","myArg").start();

据我所知,ProcessBuilder用于与操作系统上的其他软件进行通信。(可以是外部日志脚本或某种形式的日志记录软件)

FileHandler更像是一个标准的文件日志系统。但是,为了避免多个调用产生的问题,将日志代码静态化,以确保它在被调用时完成了它的进程。默认情况下,FileHandler会刷新(根据文档)。

希望这对我们有一点帮助

票数 0
EN

Stack Overflow用户

发布于 2014-06-17 13:42:11

它们是两个基本不相关的物体和区域。

是的,Process为我们提供了一个标准的输出和错误输出流,可以保存到文件中,但也可以保存到数据库或丢弃。

另一方面,ava.util.logging.FileHandler是日志记录系统的一个应用程序部分。我们通常在自己的代码中使用日志记录,但是记录外部进程的输出也没有什么问题。

但是,如果进程正在进行日志记录时,其他类会记录日志,那么就会混淆日志。

同样,如果您运行50个进程,我建议您不要登录到同一个文件。但登录到50个不同的文件-使用50个线程。每个线程将检查eroror和输出流,并在有新行或该流的末尾时保存。

当一切完成后,可以复制到日志文件或一个新的文件,如

票数 0
EN

Stack Overflow用户

发布于 2014-06-24 10:54:57

张贴您的代码实际上给了更多的了解是怎么回事。现在,我看到您正在使用windows cmd.exe重定向功能,而不是使用java读取派生进程的输出并对它们进行操作。如果你喜欢任何不同的行为,你必须:

  1. 如果可能的话,在没有cmd.exe的情况下执行进程(以避免缓冲)- new String[]{"ec2-start-instances",instance_id)
  2. 将process和stderr (更容易捕获所有输出) processBuilder.redirectErrorStream(true)结合起来
  3. 关闭过程stdin (只是一种预防措施)- process.getOutputStream().close()
  4. 生成线程来读取所有并发进程的输出流。
  5. 让这些线程以线程安全的方式将它们正在读取的内容写入文件。

现在#4和#5并不是微不足道的,但是在互联网上有大量的信息是如何实现的。在Java 7中,您还可以选择重定向到文件,而不需要从您的角色- processBuilder.redirectOutput(File file)中提取任何代码,但我认为它并不是线程安全的,因此您的多个进程将无法彼此很好地发挥作用。

这里有两个问题,给出了一些如何实现#4和#5的例子:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24264659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档