gpt4 book ai didi

java - 从 java 使用命令提示符

转载 作者:行者123 更新时间:2023-11-29 06:00:56 25 4
gpt4 key购买 nike

我正在尝试使用一些简单的命令为 Windows 命令提示符制作 Java GUI。我在额外输入方面遇到了一些问题。我可以运行“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

但是运行它会导致它卡在 line=input.readLine()

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();
}
}

如何防止挂起?我还担心确认“y”没有被正确发送。我觉得应该读取输出并写入输入,但这是我在多个在线站点上找到的方式。任何帮助,将不胜感激。

最佳答案

当您启动 Java 进程时,您必须在错误流和输入流填满之前读取它们。在 Linux/OS X 下没什么大不了的,但在 Windows 下,JVM 和子进程之间的缓冲区非常小,如果不立即开始读取,程序就会挂起。看起来代码正在为输入流执行此操作,而不是错误流,因此如果来自 del 的确认来自错误流,那么这足以挂起进程。

Java 中有一种方法可以组合输出和错误流。最简单的方法是使用 ProcessBuilder.redirectErrorStream()当您创建流程时。

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

另外,del 上有一个选项可以让它不提示确认。尝试删除/?从命令提示符。

祝你好运!

关于java - 从 java 使用命令提示符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10117373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com