java - 我如何使用一个 Java 程序来监视另一个 Java 程序的输出?

标签 java multithreading io processbuilder

下图显示了我正在尝试做的事情:它只是 2 个程序。一个是简单的 Child 程序,它每 2 秒逐行写出整数。

另一个是监控日志文件(只是一个非常基本的文本文件)的Parent 程序。如果日志文件在 5 秒内没有被修改,那么它应该重新启动 Child 程序(通过批处理文件);然后继续正常。

enter image description here

我的子类代码在这里:

package fileiotestapplication;
import java.io.*;
import java.io.IOException;
import java.util.*;


public class WriterClass {

    @SuppressWarnings("oracle.jdeveloper.java.insufficient-catch-block")
    public WriterClass() {
        super();


            int[] content = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,};
            String[] friends = {"bob",};

                File file = new File("/C:/Java_Scratch/someFile.txt");
                // if file does not exists, then create it

            try {

                if (!file.exists()) {
                    file.createNewFile();
                }


                for (int i = 0 ; i < content.length; i++) 
                {                   

                        PrintStream bw = new PrintStream( new FileOutputStream(file, true) );     

                        System.out.println("testing " + i);
                        bw.println( String.valueOf(content[i]) );
                        bw.close();


                        Thread.sleep(2500);
                }


                System.out.println("Done");
            } catch (IOException ioe) {
                // TODO: Add catch code
                ioe.printStackTrace();
            }
            catch (InterruptedException ioe) {
                            // TODO: Add catch code
                            ioe.printStackTrace();
                }

        //someIS.println(i);
        System.out.println("This is OK");



    }

    public static void main(String[] args) {
        WriterClass writerClass = new WriterClass();


    }
}

The source code

I linked here my current code for the Parent class .

我现在要做的是添加一些逻辑,当子类停止写入输出时捕获。我想做的是计算日志文件中的所有行;然后每 5 秒比较一次,这是一个好方法吗(替代方案是 - 继续检查文件是否被修改)?

编辑:下面使用 waitFor() 的建议确实有帮助,尽管我仍在研究细节:它通常是这样的:

  try {
   /* StackOverflow code */  

   for (  ;  ; )  {
   ProcessBuilder pb = new ProcessBuilder("TheBatchFile.bat");
   pb.directory(new File("C://Java_Scratch_//Autonomic_Using_Batch//"));
   Process p = pb.start();
   p.waitFor();
}
  /* end - StackOverflow code */  

  }
  catch (IOException i) {
    i.printStackTrace();
  }


  catch (InterruptedException i) {
    i.printStackTrace();
  }

最佳答案

随着文件大小的不断增长,这将变得非常缓慢。一种更简单的方法是简单地检查文件的最后修改时间。假设子程序可能停止写入文件的原因是程序终止(而不是例如卡在无限循环中),直接监视子进程本身可能更好,而不是依赖观察过程的影响。如果父进程可以首先负责启动程序,这将特别方便。

这可以通过 ProcessBuilder 来完成和 Process Java 8 中的类。从文档中复制,你可以像这样启动进程(如果你只想监视它是否正在运行):

ProcessBuilder pb = new ProcessBuilder("TheBatchFile.bat", "Argument1", "Argument2");
pb.directory(new File("/path/to/working/dir"));
Process p = pb.start();

然后,您可以简单地调用p.waitFor(); 来等待进程终止。在一个循环中执行此操作,您将拥有自动重启子行为。

关于java - 我如何使用一个 Java 程序来监视另一个 Java 程序的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33762588/

相关文章:

file - 逐行读取大文件

j2mepolish 中的 java.io.File 不工作

python - readlines() 是否保证从当前位置而不是文件开头读取(在所有 Python 实现中)?

Java 程序错误(文本字段)

ios - 使用 NSThread 时未调用 NSURLConnectionDelegate 方法

java - 我如何知道阻塞库方法是否在它们拥有的线程中执行?

c++ - 为什么 "constructor invocation"不触发任何编译器 (g++) 警告?

c++ - 在多线程环境中使用 libcurl 会导致与 DNS 查找相关的性能非常慢

java - JAXB - 解码 XML 文件

java - 在 Android 中使用 Room 和 RxJava 链接多个网络调用和数据库插入