首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java使用输入重定向

Java使用输入重定向
EN

Stack Overflow用户
提问于 2012-02-16 04:09:21
回答 3查看 3.1K关注 0票数 1
代码语言:javascript
复制
String cmd=" D:/James/1 ASU/REU/senna-v3.0/senna/senna-win32.exe -posvbs < \"D:/James/1 ASU/REU/senna-v3.0/senna/tmp.tmp\"";

Process p2 = Runtime.getRuntime().exec(cmd);

我想运行一个应用程序并从文本文件中将输入推入其中。我尝试了上面的操作,然后应用程序运行,但是应用程序抱怨说"<“不是一个有效的命令行参数。

无效参数:< D:/James/1 ASU/REU/senna-v3.0/senna/tmp.tmp SENNA Tagger (POS - CHK - NER - SRL) (c) Ronan Collobert 2009

我是如何从文件中重定向输入的?我还需要从应用程序读取输出流,我已经这样做了:

代码语言:javascript
复制
p2.waitFor();
char[] cbuf = new char[1024];
BufferedReader processOutput = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        processOutput.read(cbuf);
processOutput.read(cbuf);
System.out.println(new String(cbuf));

我不想运行程序并从stdin发送文本输入。我只想运行一次程序,等待它完成,然后读取所有的输出。造成这种情况的主要原因是,应用程序可能需要不确定的时间才能完成,我不想处理这样的问题:如果没有输出,读取将被阻塞,等等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-16 07:47:22

为什么Java没有提供这样一个库,这是我无法理解的。感谢Jim的识别,我需要线程来读取,因为java喜欢让所有东西阻塞lol.

代码语言:javascript
复制
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sennaparser;

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author james
 */
public class SennaReader {
    public String pathToSenna = "";


public String[] getReadOut(String input) throws IOException, InterruptedException
{
    Runtime rt = Runtime.getRuntime();
    String s = "cmd /C senna-win32.exe < tmp.tmp";
    //s = "cmd /C dir";
    FileWriter writer = new FileWriter( pathToSenna + "/tmp.tmp");
    writer.write(input);
    writer.close();
    Process p;
    String[] params = new String[1];
    params[0] = "";
    File f = new File(pathToSenna);
    p = rt.exec(s, params, f);

    BufferedReader processOutput = new BufferedReader(new InputStreamReader(p.getInputStream()), 500000);
    BufferedWriter processInput = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    ReadThread r = new ReadThread(processOutput);
    Thread th = new Thread(r);
    th.start();
    p.waitFor();
    r.stop();
    s = r.res;

    p.destroy();
    th.join();
    return s.split("\n");
}


public class ReadThread implements Runnable{

    BufferedReader reader;
    char[] buf = new char[100000];
    String res = "";
    boolean stop;
    public ReadThread(BufferedReader reader)
    {
        this.reader = reader;
        stop = false;
    }

    @Override
    public void run() {
    res = "";

        while (!stop) {
            try {
                reader.read(buf);
                res += new String(buf);

            } catch (IOException ex) {
                Logger.getLogger(SennaReader.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void stop()
    {
        stop = true;
    }
}

}

票数 1
EN

Stack Overflow用户

发布于 2012-02-16 04:28:09

来自Java可以Runtime.exec另一个使用stdin的java程序吗?这个职位

调用方法Process.getOutputStream,并将输入提供给返回的输出流。

...so这个看起来应该是:

代码语言:javascript
复制
String cmd = "D:/James/1 ASU/REU/senna-v3.0/senna/senna-win32.exe -posvbs";
Process p2 = Runtime.getRuntime().exec(cmd);

String fileInput = "D:/James/1 ASU/REU/senna-v3.0/senna/tmp.tmp";

BufferedWriter bufferedwriter = new BufferedWriter(new OutputStreamWriter(p2.getOutputStream()));

BufferedReader br = new BufferedReader(new FileReader(fileInput));
String s = br.readLine();
while (s != null)
{
    bufferedwriter.write(s);
    s = br.readLine();
}
bufferedwriter.flush();

...and --您可能希望用一个try/catch包围它,并可能将FileReader赋值给一个变量,以便在finally块中正确地将该变量分配给close()

票数 1
EN

Stack Overflow用户

发布于 2012-02-16 05:14:47

在Java中与单独的进程交互,正确的操作包括启动两个或三个线程,每个线程分别用于stdin、stdout和stderr (如果需要的话),并在线程上处理I/O。尝试在主线程上执行所有这些操作可能会导致主线程或外部进程挂起。例如,如果您首先读取进程的stdout,并且需要输入,那么一切都会停止。如果您首先处理发送输入,并且输出填充了内部缓冲区,外部进程将停止运行。

为每个流启动一个单独的线程,并执行线程上的所有I/O操作。将主线程与I/O线程和外部进程连接起来,以便在所有操作完成后进行清理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9305413

复制
相关文章

相似问题

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