简单Java进程输入/输出失败

简单Java进程输入/输出失败,java,process,inputstream,runtime.exec,Java,Process,Inputstream,Runtime.exec,我已经研究了许多关于Java中派生进程的输入/输出的问题,但我仍然无法找出我的程序的错误。它很短很简单,但不起作用。我正在使用Runtime对象的exec()方法来创建新流程(我知道ProcessBuilder可能更好,但这只是一个简单的赋值,我真的不必担心生成流程的stderr) 我自己从IDE/命令行运行“Processor”类。Memory.java位于同一目录中 public class Memory { public static void main(String[] arg

我已经研究了许多关于Java中派生进程的输入/输出的问题,但我仍然无法找出我的程序的错误。它很短很简单,但不起作用。我正在使用Runtime对象的exec()方法来创建新流程(我知道ProcessBuilder可能更好,但这只是一个简单的赋值,我真的不必担心生成流程的stderr)

我自己从IDE/命令行运行“Processor”类。Memory.java位于同一目录中

public class Memory 
{
    public static void main(String[] args)
    {
        System.out.println("Memory works!");
    }
}
另一个项目:

import java.io.IOException;
import java.io.InputStream;

public class Processor 
{
    public static void main(String[] args)
    {
        Runtime rt = Runtime.getRuntime();
        Process proc = null;

        try {
            proc = rt.exec("java Memory");  //execute Memory.java which is in same directory
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.exit(2); //exit code 2 means that process creation failed.
        }

        //stream to get output from memory
        InputStream fromProcess = proc.getInputStream();

        int x;

        try {
            while((x = fromProcess.read()) != -1)
                System.out.print((char)x);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

没有输出,程序永远不会终止。这可能是因为扫描仪内存中存在while循环,但至少应该有一些输出,对吗?

这里的问题几乎可以肯定是“java内存”命令失败了

当您运行一个进程时,Java会创建三个输出:退出代码、STDOUT和STDERR。一个运行外部进程的好程序,将检查所有三个

你只是在检查标准件

如果在生成过程后更改代码,则为:

    //stream to get output from memory
    InputStream fromProcess = proc.getInputStream();
    InputStream fromError = proc.getErrorStream();

    int x;

    try {
        while((x = fromProcess.read()) != -1)
            System.out.print((char)x);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        while((x = fromError.read()) != -1)
            System.err.print((char)x);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    int exit = proc.exitValue();
    System.out.println("Exited with code " + exit);
你会更好地了解出了什么问题


管理这三个输出是很困难的,许多系统实现一个单独的线程来控制STDERR和STDOUT流。您如何解决它超出了本问题的范围。

我尝试了您编写的代码,它运行得很好

您是想从命令行还是IDE中运行它?我尝试在Eclipse中运行它,但收到一个IO错误。它没有注册Memory.class所在的位置


我退出文件系统并导航到Memory.class和Processor.class所在的位置。从该目录中执行操作效果很好。

“我真的不必担心派生进程的stderr”哼。。。看看它:它肯定会告诉你出了什么问题;-)我建议您使用几个调试步骤来了解发生了什么。首先,注意stderr,因为它可能会指出问题所在。第二,尝试运行一些其他命令,您确信它将根据您正在使用的操作系统以ls或dir命令的形式输出到stdout,如果您看到输出,这还可以告诉您正在使用哪个当前目录,这将有助于确保我们处于正确的上下文中。最后,我只是想检查一下,processors类执行的当前目录中是否有编译过的memory.class文件?我已经回滚了您的大量编辑。。。因为它们使得当前的答案毫无用处。如果您的代码仍然存在问题,以及列出的其他建议(如添加调试步骤),请提出一个单独的问题,以缩小新问题的范围,并包括相关的输出。我已经编辑了程序,现在处理器将数据发送到内存的stdin,内存将数据打印到stdout(发送到处理器的fromStream)。但什么也没发生。我真的很感谢您再次提供帮助,谢谢!是的,这就是错误。我在Eclipse中运行它,没有检查错误流。但是现在,当我尝试来回发送数据时,我遇到了问题。请查看编辑过的问题。再次感谢!您尝试过从命令行运行它吗?正如我所说的,它运行得很好,如下所示为我写的。