首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中使用IO流

在Java中使用IO流
EN

Stack Overflow用户
提问于 2010-12-23 05:19:44
回答 4查看 1.2K关注 0票数 1

我需要使用Java启动一个二进制文件,然后使用输入流和输出流与其交互。我已经写了一个原型来弄清楚它是如何工作的,但到目前为止,我得到的唯一输出是null。但是,当它自己运行时,子程序会产生输出。我做错了什么?

代码语言:javascript
复制
import java.io.*;

public class Stream {
    public static void main(String args[]) {
    Process SaddleSumExec = null;
    BufferedReader outStream = null;
    BufferedReader inStream = null;

    try {
        SaddleSumExec = Runtime.getRuntime().exec("/home/alex/vendor/program weights.txt list.txt");
    }
    catch(IOException e) {
        System.err.println("Error on inStream.readLine()");
        e.printStackTrace();
    }

    try {
        inStream = new BufferedReader(new InputStreamReader
                      (SaddleSumExec.getInputStream()));
        System.out.println(inStream.readLine());
    }
    catch(IOException e){
        System.out.println("Error.");
    }

    }
}
EN

回答 4

Stack Overflow用户

发布于 2010-12-23 07:56:40

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class Prompt {
//flag to end readers and writer
boolean processEnd = false;

public static void main(String[] args) {
    new Prompt();
}

public Prompt() {

    Process SaddleSumExec = null;
    Input in = new Input(this);
    Output out = new Output(this);
    Input err = new Input(this);
    //thread to read a write console
    Thread t1 = new Thread(in);
    Thread t2 = new Thread(out);
    Thread t3 = new Thread(err);

    try {
        SaddleSumExec = Runtime
                .getRuntime()
                .exec(
                         "ConsoleApplication1/bin/Debug/ConsoleApplication1");

        in.input = SaddleSumExec.getInputStream();
        err.input = SaddleSumExec.getErrorStream();
        out.out = SaddleSumExec.getOutputStream();
        t2.start();
        t1.start();
        t3.start();

        SaddleSumExec.waitFor();
        processEnd = true;

    } catch (IOException e) {
        System.err.println("Error on inStream.readLine()");
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

public boolean isProcessEnd() {
    return processEnd;
}

public void setProcessEnd(boolean processEnd) {
    this.processEnd = processEnd;
}
/*Readers of Inputs*/
class Input implements Runnable {
    private BufferedReader inStream;
    InputStream input;
    Prompt parent;

    public Input(Prompt prompt) {
        // TODO Auto-generated constructor stub
        parent = prompt;
    }

    public void run() {
        inStream = new BufferedReader(new InputStreamReader(input));
        while (!parent.isProcessEnd()) {
            try {
                String userInput;
                while ((userInput = inStream.readLine()) != null) {
                    System.out.println(userInput);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
/*Writers of Output*/
class Output implements Runnable {
    OutputStream out;
    Prompt parent;

    public Output(Prompt prompt) {
        parent = prompt;
        // TODO Auto-generated constructor stub
    }

    @Override
    public void run() {

        while (!parent.isProcessEnd()) {
            try {
                String CurLine = "";
                InputStreamReader converter = new InputStreamReader(
                        System.in);
                BufferedReader in = new BufferedReader(converter);

                while (!(CurLine.equals("quit"))) {
                    CurLine = in.readLine();
                    if (!(CurLine.equals("quit"))) {
                        out.write((CurLine + "\n").getBytes());
                        out.flush();
                    }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

}

票数 2
EN

Stack Overflow用户

发布于 2010-12-23 05:28:25

您似乎并不是在等待子进程结束,所以父进程有可能在有机会读取输出流之前就结束了。

这里有一篇关于Runtime.exec的古老而优秀的文章

http://www.javaworld.com/jw-12-2000/jw-1229-traps.html

正确的实现在这个页面上。

http://www.javaworld.com/jw-12-2000/jw-1229-traps.html?page=4

票数 0
EN

Stack Overflow用户

发布于 2010-12-23 05:32:45

据我所知,这里可能存在两个问题:

  1. 您是否正在尝试在子程序开始读取之前获取对流的访问权限?
  2. 您是否正在运行访问权限不足的父进程?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4513846

复制
相关文章

相似问题

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