使用java中的命令提示符

使用java中的命令提示符,java,cmd,Java,Cmd,我试图用一些简单的命令为windows命令提示符制作一个JavaGUI。我有一些额外的输入问题。我可以运行“dir”命令,但当我运行“del”命令时,我需要进行确认,但我似乎无法让它打印出确认消息 public static void main(String args[]) { try { Process p = Runtime.getRuntime().exec("cmd /c dir"); read(p); } catch (IOExcepti

我试图用一些简单的命令为windows命令提示符制作一个JavaGUI。我有一些额外的输入问题。我可以运行“dir”命令,但当我运行“del”命令时,我需要进行确认,但我似乎无法让它打印出确认消息

public static void main(String args[])
{
    try {
        Process p = Runtime.getRuntime().exec("cmd /c dir");
        read(p);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void read(Process p)
{
    try{
        BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while((line=input.readLine()) != null) {
            System.out.println(line);
        }   
    }
    catch(IOException e1) { e1.printStackTrace(); }
}
输出:

 Volume in drive E has no label.
 Volume Serial Number is E9ED-7E32

 Directory of E:\Code\workspace\Project

04/11/2012  11:07 PM    <DIR>          .
04/11/2012  11:07 PM    <DIR>          ..
04/11/2012  09:53 PM               301 .classpath
04/11/2012  09:53 PM               383 .project
04/11/2012  09:53 PM    <DIR>          .settings
04/12/2012  12:09 AM    <DIR>          bin
04/12/2012  12:09 AM    <DIR>          src
04/11/2012  11:07 PM    <DIR>          test
               2 File(s)            684 bytes
               6 Dir(s)  429,106,937,856 bytes free
我该如何防止这种上吊?我还担心确认“y”没有正确发送。我觉得应该读输出,写输入,但这是我在多个网站上发现的方式。任何帮助都将不胜感激

其所有标准io(即stdin、stdout、stderr)操作将通过三个流(process.getOutputStream()、process.getInputStream()、process.getErrorStream())从原始进程重定向到父进程。 请您检查确认信息是否是ErrorStream的一部分。
此外,要输入删除确认y,还需要使用inputStream。

启动Java进程时,必须先读取错误流和输入流,然后再填充它们。在Linux/OSX下这没什么大不了的,但在Windows下,JVM和子进程之间的缓冲区非常小,如果不立即开始读取,程序就会挂起。看起来代码是针对输入流而不是错误流这样做的,因此如果来自del的确认来自错误流,那么这就足以挂起进程

Java中有一种方法可以将输出流和错误流结合起来。最简单的方法是在创建流程时使用

代码的另一个可能问题是使用了
readLine()。
如果子程序发送的输出没有换行符,那么父程序将不会收到它-因为对readLine的调用将只是等待行的结束(IIRC del会这样做)。使用BufferedReader很好,但它确实应该一次读取一个字节/字符。如果代码在专用线程中执行此操作,那么它也更健壮,如果程序在您尝试传递输入时发送输出,那么它就不会挂起

此外,del上还有一个选项,可以使其不提示确认。试试del/?从命令提示中


祝你好运

这解决了阅读问题,但我似乎仍然无法将输入发送回程序。除了sWriter,我还应该做些别的事情吗;sWriter.newLine();?我尝试使用read()分别读取每个字符。它现在打印到冻结点。我该怎么办?您可能希望在read停止返回字符后发送输出。我还将
flush()
输出,直到进程终止才关闭它。
public static void main(String args[])
{
    try {
        Process p = Runtime.getRuntime().exec("cmd /c del test");
        read(p);
        OutputStream oStream = p.getOutpuStream();
        BufferedWriter sWriter = new BufferedWriter(newOutputStreamWriter(oStream));
        sWriter.write("y");
        sWriter.newLine();
        oStream.close();
        read(p);
    } catch (IOException e) {
        e.printStackTrace();
    }
}