Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProcessBuilder和FileHandler之间的区别_Java_Processbuilder_Filehandler - Fatal编程技术网

Java ProcessBuilder和FileHandler之间的区别

Java ProcessBuilder和FileHandler之间的区别,java,processbuilder,filehandler,Java,Processbuilder,Filehandler,请任何人解释一下ProcessBuilder和FileHandler之间的区别,在哪种情况下应该使用哪一种 例如,如果要将命令的输出重定向到文本文件(如logfile.txt),ProcessBuilder需要几秒钟才能将输出重定向到该文件 在100个进程必须将其输出发送到同一个logfile.txt的情况下,此FileHandler可以做什么 有没有一种方法可以不使用ProcessBuilder中的process.waitFor方法将所有一百条记录输出到同一个logfile.txt?这是我的代

请任何人解释一下ProcessBuilder和FileHandler之间的区别,在哪种情况下应该使用哪一种

例如,如果要将命令的输出重定向到文本文件(如logfile.txt),ProcessBuilder需要几秒钟才能将输出重定向到该文件

在100个进程必须将其输出发送到同一个logfile.txt的情况下,此FileHandler可以做什么

有没有一种方法可以不使用ProcessBuilder中的process.waitFor方法将所有一百条记录输出到同一个logfile.txt?这是我的代码,但如果同时调度了100条记录,那么p.waitfor方法将帮不上我的忙,因为对于每个进程,执行命令并将输出到日志文件需要几秒钟,对于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();
            }
        }
    }
对于ProcessBuilder,根据文档:

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

范例

进程p=新的ProcessBuildermyCommand,myArg.start

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

FileHandler更像是一个标准的文件日志记录系统。但是,为了避免多次调用带来的问题,请将日志代码设置为静态,以确保在调用时完成其进程。默认情况下,FileHandler会根据文档进行刷新


希望这有点帮助

它们是两个几乎不相关的对象和区域

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

另一方面,ava.util.logging.FileHandler是日志系统的附录部分。我们通常对自己的代码使用日志记录,尽管我们在那里调用的外部进程的输出也记录下来,这并没有什么错

但若其他类在进程进行日志记录时进行日志记录,那个么将得到混合日志

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


当所有这些都完成后,您可以复制到日志文件或新文件中作为首选。T

发布您的代码实际上会让您更清楚地了解发生了什么。现在,我看到您正在使用windows cmd.exe重定向功能,而不是使用java读取派生进程的输出并对其进行处理。 如果你喜欢任何不同的行为,你必须:

如果可能,在不使用cmd.exe的情况下执行进程,以避免缓冲-新字符串[]{ec2 start instances,instance_id 结合进程stdout和stderr更容易捕获所有输出processBuilder.redirectErrorStreamtrue 关闭进程stdin只是一种预防措施-process.getOutputStream.close 生成线程以读取所有并发进程输出流 让这些线程以线程安全的方式将正在读取的内容写入文件 现在4和5都不是微不足道的,但是互联网上有很多关于如何实现的信息。在Java 7中,您还可以选择重定向到文件,而无需使用part-processBuilder.redirectOutputFile文件中的任何代码,但我认为它不是线程安全的,因此您的多个进程不能很好地相互配合

以下两个问题给出了如何实现4和5的示例:


您可以刷新outputstream以获得写入文件的更改。缓冲区的大小取决于您使用的outputstream实现。请提供更多详细信息和示例,说明您试图实现的目标。链接中的代码是我的,应该使用这两个概念中的任何一个。很抱歉,我无法在此处发布代码,因为它与我无关我在这里问的问题。请看一下代码,并建议我是否可以使用processbuilder、filehandler或threadpool,正如下面回答中的一位用户所提到的。当我问你代码示例时,那是因为你的问题表明你对正在发生的事情有一些误解或不清楚。几行代码的使用将更清楚地说明问题所在。先生,我已经给出了代码,您能否建议我适当的方法,使所有输出都能在使用过程中不出现时间延迟地发送到同一个日志文件中。waitFor??Hai感谢您的回复。但实际情况是每分钟一次的web应用程序
所以,每分钟它都必须记录所有文件的日志,正如我提到的50到100个进程,在cmd中使用java程序执行的每个进程/命令都是在那个时候安排的,那个特定的输出只应该在每分钟追加到同一个文件中。所以,如果在那一分钟,我也不能将输出复制到单个文件,然后将所有输出复制到一个文件。这将是web应用程序的额外工作。但是tnx的信息。它仍然应该在线程中完成,java可以启动100个线程一分钟,只要他们的任务在一分钟内完成。可以让控制线程监视工作线程,以查看是否有任何线程被卡住。有许多方法可以解决任何软件问题,建议使用线程池并为每个流分离线程,以提高健壮性。但若命令只需要几秒钟,那个么*可以在一个线程中执行。线程池是个好主意。我知道它能做什么,但我不知道它的实现。我将尝试在我的程序中实现它,并在它工作后尽快通知您。谢谢您的回复。但正如您所建议的,我不能使日志代码保持静态,我的web应用程序每分钟启动一次并检查DB中的记录,我的意思是每分钟有50到100个进程,并且日志信息也必须根据验证中成功的每条记录进行更改。但是您关于它们之间差异的信息非常有用,谢谢。@user3364490将同步您的日志记录方法用于您吗?抱歉,我没有使用任何同步方法,我使用processbuilder将命令输出到文件,然后使用process.waitFor将输出获取到文件,然后转到下一次迭代。在这里,如果同时调度了大约10万条记录,那么每个进程都要执行命令,并且每个进程都必须等待。所以实际上不能在1分钟内执行。同步方法将一次执行一个线程,对吗?据我所知,如果进程进入Synchronized方法,并且由于任何原因无法完成操作,那么其他进程都无法将其输出输入到该文件中,因为它位于另一个进程中。那么在这种情况下,它将如何帮助我?如果我错了,你能解释为什么吗??我想知道。谢谢。先生,如果我删除cmd.exe,我的命令[ec2 start instances]将在哪里执行?@user3364490,cmd.exe是一个shell解释器或类似的解释器。这些进程在操作系统本身上执行。因此,只有在执行windows命令批处理文件时,才需要使用cmd.exe。如果您正在执行一些本机二进制可执行文件,则不需要通过shell来执行它们,而是直接执行它们。很抱歉,无法理解您所说的,ec2 start实例仅在cmd中执行。所以我在上面提到的代码中使用了cmd。你能把你的建议解释清楚吗?因此,它可能会帮助我的工作。我试图执行我的程序删除cmd.exe,但无法获得输出。所以现在我更加确信ec2命令的执行也需要cmd.exe。。我在这里记录了操作日志,以了解每次应用程序启动时的延迟时间1如果没有调度实例,则延迟时间为5秒2如果有调度实例,则延迟时间可能会超过该时间。例如,假设同时调度2个实例,则意味着每个实例的延迟时间可能为3到5秒。我没有找到替代方法进程。等待。我希望我能很快解决我的问题。