Java进程IO
我在linux中使用java启动GNOME终端进程,并将其输入和输出重定向到我的代码。下面是一个代码Java进程IO,java,linux,Java,Linux,我在linux中使用java启动GNOME终端进程,并将其输入和输出重定向到我的代码。下面是一个代码 public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub /usr/bin/telnet try { String line, commandInpu
public static void main(String[] args) throws InterruptedException
{
// TODO Auto-generated method stub /usr/bin/telnet
try
{
String line, commandInput;
Scanner scan = new Scanner(new File("/home/Ashutosh/Documents/testfile"));
ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash");///home/Ashutosh/Documents/tempScript");
telnetProcessBuilder.redirectErrorStream(true);
Process telnetProcess = telnetProcessBuilder.start();
//Process telnetProcess = Runtime.getRuntime().exec("xterm");///home/Ashutosh/Documents/tempScript");
BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream()));
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream()));
while(scan.hasNext())
{
commandInput = scan.nextLine();
output.write(commandInput);
/* if(commandInput.trim().equals("exit"))
{
output.write("exit\r");
}
else
{
output.write("((" + commandInput + ") && echo --EOF--) || echo --EOF--\r");
}
*/ output.flush();
line = input.readLine();
while(line != null && !line.trim().equals("--EOF--"))
{
System.out.println(line);
line = input.readLine();
}
if(line == null)
break;
}
/* Thread.sleep(500);
output.write("/home/Ashutosh/Documents/testfile\r");
Thread.sleep(500);
output.flush();
while((line = input.readLine())!= null)
System.out.println(line);
telnetProcess.destroy();
*/ //String s = input.readLine();
//System.out.print(s + "\r\n");
//s = input.readLine();
//System.out.print(s + "\r\n");
}
作为bash脚本的testfile的内容是
#!/bin/bash
ls -l
pwd
date
exit
我还尝试了下面的交互式脚本,它从用户那里获取输入,我想从java代码中重定向
#! /bin/bash
echo "Input any number form 0-3:"
read num
case $num in
0) echo "You are useless";;
1) echo "You are number 1";;
2) echo "Too suspecious";;
3) echo "Thats all man, got to go...!";;
*) echo "Cant't u read english, this is wrong choice";;
esac
read
exit
我的代码在input.readLine()处停止代码>我不确定,但我想我无法重定向输出流
output.write(commandInput);
命令执行得很好,但没有在进程重定向输入上写入我想要的内容,这就是为什么它挂起在readLine()代码>。
如果有人已经解决了,请让我知道解决方案。
通过以下链接,我试图解决问题,但仍然没有成功:
谢谢
AshutoshreadLine()读取一行的内容,末尾不带换行符
write()只写文本,不添加新行
可能要添加write(“\n”);或者使用PrintStream或PrintWriter
我想,你的剧本将作为
#!/bin/bashls -lpwddateexit
这是一个没有换行符的注释。readLine()读取一行的内容,结尾没有换行符
write()只写文本,不添加新行
可能要添加write(“\n”);或者使用PrintStream或PrintWriter
我想,你的剧本将作为
#!/bin/bashls -lpwddateexit
这是一个没有换行符的注释。编辑:巨大错误,未将命令添加到ProcessBuilder
为什么您不只是将脚本作为Linux脚本运行?就是
ProcessBuilder builder = new ProcessBuilder();
LinkedList<String> command = new LinkedList<String>();
command.add("/bin/bash");
command.add("/home/Ashutosh/Documents/testfile");
builder.command(command);
Process myProc = builder.start();
ProcessBuilder=newprocessbuilder();
LinkedList命令=新建LinkedList();
add(“/bin/bash”);
add(“/home/Ashutosh/Documents/testfile”);
生成器命令(command);
进程myProc=builder.start();
另外,我注意到变量名为“telnetProcess”,但在我能看到的任何地方都没有调用telnet。也许这就是问题所在
编辑:在下面为交互式脚本添加了我的建议
ProcessBuilder builder = new ProcessBuilder();
LinkedList<String> command = new LinkedList<String>();
command.add("/bin/bash");
command.add("/path/to/interactiveScript");
builder.command(command);
final Process myProc = builder.start();
// Java input goes to process input.
Thread inputParser = new Thread() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(myProc.getOutputStream()));
String line = "";
while(line != null) {
line = br.readLine();
bw.write(line);
bw.newLine();
}
}
}.start();
// Process output must go to Java output so user can see it!
Thread outputParser = new Thread() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(myProc.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = "";
while(line != null) {
line = br.readLine();
bw.write(line);
bw.newLine();
}
}
}.start();
ProcessBuilder=newprocessbuilder();
LinkedList命令=新建LinkedList();
add(“/bin/bash”);
add(“/path/to/interactiveScript”);
生成器命令(command);
最终流程myProc=builder.start();
//Java输入转到进程输入。
线程inputParser=新线程(){
公开募捐{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
BufferedWriter bw=新的BufferedWriter(新的OutputStreamWriter(myProc.getOutputStream());
字符串行=”;
while(行!=null){
line=br.readLine();
写入(行);
换行符();
}
}
}.start();
//进程输出必须转到Java输出,以便用户可以看到它!
Thread outputParser=新线程(){
public void run(){
BufferedReader br=新的BufferedReader(新的InputStreamReader(myProc.getInputStream());
BufferedWriter bw=新的BufferedWriter(新的OutputStreamWriter(System.out));
字符串行=”;
while(行!=null){
line=br.readLine();
写入(行);
换行符();
}
}
}.start();
编辑:巨大错误,未将命令添加到ProcessBuilder
为什么您不只是将脚本作为Linux脚本运行?就是
ProcessBuilder builder = new ProcessBuilder();
LinkedList<String> command = new LinkedList<String>();
command.add("/bin/bash");
command.add("/home/Ashutosh/Documents/testfile");
builder.command(command);
Process myProc = builder.start();
ProcessBuilder=newprocessbuilder();
LinkedList命令=新建LinkedList();
add(“/bin/bash”);
add(“/home/Ashutosh/Documents/testfile”);
生成器命令(command);
进程myProc=builder.start();
另外,我注意到变量名为“telnetProcess”,但在我能看到的任何地方都没有调用telnet。也许这就是问题所在
编辑:在下面为交互式脚本添加了我的建议
ProcessBuilder builder = new ProcessBuilder();
LinkedList<String> command = new LinkedList<String>();
command.add("/bin/bash");
command.add("/path/to/interactiveScript");
builder.command(command);
final Process myProc = builder.start();
// Java input goes to process input.
Thread inputParser = new Thread() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(myProc.getOutputStream()));
String line = "";
while(line != null) {
line = br.readLine();
bw.write(line);
bw.newLine();
}
}
}.start();
// Process output must go to Java output so user can see it!
Thread outputParser = new Thread() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(myProc.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = "";
while(line != null) {
line = br.readLine();
bw.write(line);
bw.newLine();
}
}
}.start();
ProcessBuilder=newprocessbuilder();
LinkedList命令=新建LinkedList();
add(“/bin/bash”);
add(“/path/to/interactiveScript”);
生成器命令(command);
最终流程myProc=builder.start();
//Java输入转到进程输入。
线程inputParser=新线程(){
公开募捐{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
BufferedWriter bw=新的BufferedWriter(新的OutputStreamWriter(myProc.getOutputStream());
字符串行=”;
while(行!=null){
line=br.readLine();
写入(行);
换行符();
}
}
}.start();
//进程输出必须转到Java输出,以便用户可以看到它!
Thread outputParser=新线程(){
public void run(){
BufferedReader br=新的BufferedReader(新的InputStreamReader(myProc.getInputStream());
BufferedWriter bw=新的BufferedWriter(新的OutputStreamWriter(System.out));
字符串行=”;
while(行!=null){
line=br.readLine();
写入(行);
换行符();
}
}
}.start();
嗨,伙计们,很抱歉反应太晚,经过一些试验后,我让它工作了。我只是让进程完成其进程并正常退出,而不是强制退出,然后BufferedReader和BufferedWriter将字符串缓冲区保留在RAM中,我现在可以在进程退出后读取,代码为0
public static void main(String[] args) throws InterruptedException
{
// TODO Auto-generated method stub
try
{
String line, commandInput;
ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash");
telnetProcessBuilder.redirectErrorStream(true);
Process telnetProcess = telnetProcessBuilder.start();
BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream()));
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream()));
commandInput = "ls -l\n";
output.write(commandInput);
output.flush();
commandInput = "pwd\n";
output.write(commandInput);
output.flush();
commandInput = "whoami\n";
output.write(commandInput);
output.flush();
commandInput = "exit\n";
output.write(commandInput);
output.flush();
while((line = input.readLine())!= null)
System.out.println(line);
}
}
嗨,伙计们,很抱歉反应太晚,经过一些试验,我让它工作了。我只是让进程完成其进程并正常退出,而不是强制退出,然后BufferedReader和BufferedWriter将字符串缓冲区保留在RAM中,我现在可以在进程退出后读取,代码为0
public static void main(String[] args) throws InterruptedException
{
// TODO Auto-generated method stub
try
{
String line, commandInput;
ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash");
telnetProcessBuilder.redirectErrorStream(true);
Process telnetProcess = telnetProcessBuilder.start();
BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream()));
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream()));
commandInput = "ls -l\n";
output.write(commandInput);
output.flush();
commandInput = "pwd\n";
output.write(commandInput);
output.flush();
commandInput = "whoami\n";
output.write(commandInput);
output.flush();
commandInput = "exit\n";
output.write(commandInput);
output.flush();
while((line = input.readLine())!= null)
System.out.println(line);
}
}
我知道它的对象的愚蠢名称,但这与telnet无关,它只是一个简单的测试应用程序,我想在其中测试java进程IO。在我的一个应用程序中,我需要用户调用这个java应用程序,它可以运行所有脚本并将所有输出发送给用户,而无需用户干预。在上面的代码中,您正在java应用程序中运行/bin/bash,并在输出流中发送内容,希望bash能够从stdin读取并处理它。我认为首先您应该尝试我之前建议的更简单的选项,使用命令“/bin/bash/home/Ashutosh/Document/testfile”来运行