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

标签 java process inputstream runtime.exec

我已经查看了许多有关 Java 中派生进程的输入/输出的问题,但我仍然无法弄清楚我的程序出了什么问题。它真的很短很简单,但它不起作用。我正在使用 Runtime 对象的 exec() 方法来创建新进程(我知道 ProcessBuilder 可能更好,但这是一个简单的分配,我真的不必担心生成进程的标准错误) .

我自己从 IDE/命令行运行“处理器”类。 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。

如果您在构建过程后更改代码,则为:

    //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 流。你如何解决它超出了这个问题的范围。

关于java - 简单的 Java 进程输入/输出失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26194144/

相关文章:

java - 如何获取 1 :M entity from parent class with limit?

linux - 当进程终止时内核是否删除打开的文件

Java SocketServer 正在接受来自 Socket 客户端的输入,但 Socket 客户端未接收来自 SocketServer 的输入

java - JUnit assertEquals 失败

java - 将sql文件名从jsp传递到servlet以进行数据导入

Java从数组列表中获取随机字符串

linux - 监控进程的网络使用情况

powershell - 终止多台远程计算机上的进程

java - 读取 XLSX 工作簿时 Apache POI 抛出 IOException

java - 带 StringReader 的换行符 -\n 被忽略了吗?