首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java进程IO

Java进程IO
EN

Stack Overflow用户
提问于 2011-04-27 19:11:14
回答 3查看 1.6K关注 0票数 0

我正在使用java在linux中启动GNOME终端进程,并将其输入和输出重定向到我的代码。下面是一段代码。

代码语言:javascript
复制
        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的内容是

代码语言:javascript
复制
#!/bin/bash

ls -l
pwd
date
exit

我还尝试了下面的交互式脚本,它接受用户的输入,我想从java代码中重定向

代码语言:javascript
复制
#! /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();。我不确定,但我认为我无法重定向输出流。

代码语言:javascript
复制
output.write(commandInput);

命令执行得很好,但没有在进程重定向输入上写入我想要的内容,这就是它在readLine();挂起的原因。如果有人已经解决了,请让我知道解决方案。通过下面的链接,我试图解决这个问题,但仍然没有成功:

Java Process with Input/Output Stream

谢谢

Ashutosh

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-02 13:07:10

嗨,伙计们,很抱歉反应晚了,经过一些试验,我把它弄好了。我只是让进程正常地完成它的进程并退出,而不是强制退出,然后BufferedReader和BufferedWriter将字符串缓冲区保存在内存中,我现在可以在进程退出后读取它,代码为0。

代码语言:javascript
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-04-27 19:22:21

readLine()读取行的内容,末尾不带换行符。

write()只写文本,它不会添加新行。

您可能希望添加write("\n");或使用PrintStream或PrintWriter。

我想,你的脚本是作为

代码语言:javascript
复制
#!/bin/bashls -lpwddateexit

这是一个没有换行符的注释。

票数 2
EN

Stack Overflow用户

发布于 2011-04-27 19:22:45

编辑:巨大的错误,没有将命令添加到ProcessBuilder!!

为什么你不把你的脚本作为Linux脚本运行呢?那是,

代码语言:javascript
复制
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();

另外,我注意到这个变量被命名为'telnetProcess‘,但是在我能看到的任何地方都没有调用telnet。也许这就是问题所在?

编辑:添加了我对交互式脚本的建议。

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5803094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档