【发布时间】:2015-11-17 16:49:51
【问题描述】:
下图显示了我正在尝试做的事情:它只是 2 个程序。一个是简单的Child 程序,它每 2 秒逐行写出整数。
另一个是Parent 程序,它监视日志文件(只是一个非常基本的文本文件)。如果日志文件在 5 秒内没有被修改,那么它应该重新启动 Child 程序(通过批处理文件);然后正常继续。
我的子类代码在这里:
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();
}
}
还有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();
}
【问题讨论】:
-
文件不能监控任何东西。你的意思是'如何使用一个Java 程序来监控另一个Java 程序的输出'?
-
父子进程是分开运行的吗?或者孩子是一个“孩子”线程?
-
@EJP - 正确 - 我们需要监控输出
-
我喜欢那个图!
-
@Coffee 如果您只是想监视子程序,那么写入文件比使用 ProcessBuilder 或类似的东西要慢得多。不过,这已经在另一个答案中了。
标签: java multithreading io processbuilder