繁体   English   中英

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

[英]Simple Java Process Input/Output failing

我已经查看了许多关于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 Memory”命令失败了。

运行进程时,Java会创建三个输出,即退出代码,STDOUT和STDERR。 一个运行外部进程的好程序,将检查这三个。

你只是检查STDOUT。

如果在构建proc之后更改代码,则为:

    //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所在的位置。 从该目录中执行工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM