创建一个桥梁来与从shell脚本启动的Java进程通信。喜欢的东西下面:
startreader.sh
#!/bin/bash
echo "" > inputbridge.txt
tailf inputbridge.txt | java SampleRead
SampleRead.java
import java.util.Scanner;
public class SampleRead {
public static void main(String [] args) {
Scanner scanner = new Scanner(System.in);
int readValue = 0;
while((readValue = scanner.nextInt()) != 5) {
System.out.println("Send me something other than " + readValue);
}
System.out.println("Good job. Bye");
}
}
NumberGenerator.java
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class NumberGenerator {
public static void main(String [] args) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder("./startreader.sh");
Process process = processBuilder.start();
Scanner processStreamReader = new Scanner(process.getInputStream());
String processInputString = null;
do {
try(FileWriter fileWriter = new FileWriter("inputbridge.txt", true)) {
fileWriter.write(((int)(Math.random() * ((10 - 1) + 1)) + 1) + "\n");
} catch(IOException e) {
e.printStackTrace();
}
processInputString = processStreamReader.nextLine();
System.out.println(processInputString);
} while(processInputString.startsWith("Send me something other than"));
}
}
个
步骤来运行:
- 编译
SampleRead.java
和NumberGenerator.java
- 提供
startreader.sh
- 运行
java NumberGenerator
输出
[[email protected] java]$ java NumberGenerator
Send me something other than 1
Send me something other than 6
Send me something other than 8
Send me something other than 4
Good job. Bye
[[email protected] java]$ cat inputbridge.txt
1
6
8
4
5
执行权限
这是如何工作: 桥的NumberGenerator
和SampleRead
之间是通过startreader.sh
产生inputbridge.txt
文件。当NumberGenerator
运行时,它会执行startreader.sh
,它会生成inputbridge.txt
并清空它。 startreader.sh
的下一个阶段是在inputbridge.txt
文件上做tailf
。写入此文件的任何新行将通过tailf
进程成为SampleRead
的输入。
当NumberGenerator
随机选择一个号码,通过写inputbridge.txt
发送到SampleRead
,它就会通过SampleRead
收到,检查它是否是值5。除值5将输出“送我的东西......”这是读通过NumberGenerator
通过ProcessInputStream
。
这种做法应该与支票java进程存在执行shell脚本后得到加强。而且,tailf
进程在手动终止之前不会退出。因此,tailf
可以替换为另一个代理java应用程序,它具有与NumberGenerator
类型的应用程序通信的协议,以了解何时结束执行。如果开发Java代理应用程序,您可以考虑使用Sockets
而不是文件。
嗨,对不起,迟到的回应。但我无法获得与您指示的相同的输出。我的输出只是一个空白屏幕,如果我输入任何数字,它都不会显示任何内容。请让我知道我要出错的地方 –
您是否想要运行示例代码? –
是的,我试图运行代码 –