Cof*_*fee 1 java io multithreading processbuilder
下面的图表显示了我正在尝试做的事情:它只是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();
}
}
Run Code Online (Sandbox Code Playgroud)
我现在要做的是添加一些在子类停止写输出时捕获的逻辑.我想做的是计算日志文件中的所有行; 然后每隔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();
}
Run Code Online (Sandbox Code Playgroud)
随着文件大小的增加,这将变得非常慢.一种更简单的方法是简单地检查文件的最后修改时间.假设子程序可能停止写入文件的原因是程序终止(而不是例如挂在无限循环中),最好直接监视子进程本身而不是依赖于观察进程的影响.如果父进程可以首先负责启动程序,这将特别方便.
这可以通过Java 8中的ProcessBuilder和Process类来完成.从文档中复制,您可以像这样开始这个过程(如果您只想监视它是否正在运行):
ProcessBuilder pb = new ProcessBuilder("TheBatchFile.bat", "Argument1", "Argument2");
pb.directory(new File("/path/to/working/dir"));
Process p = pb.start();
Run Code Online (Sandbox Code Playgroud)
然后,您可以简单地调用p.waitFor();以等待进程终止.在循环中执行此操作,您将自动重新启动子行为.