试着找出我所缺少的东西(我对一些高级编程概念仍然非常环保,这可能就是为什么我没有完全掌握我的问题):我正在创建一个允许用户使用的应用程序等等,打开用户输入的特定文档,应用程序或命令行说明。
我无法工作的地方是尝试创建一个ProcessBuilder对象来测试用户输入的命令行(macOS和Windows投诉)。对于通用命令行,例如ls
(macOS)或dir
(Windows),我的代码运行正常。但是当我尝试一个需要用户交互的命令行时,我无法使输出/输入/错误流正常工作。我看到很多关于问题的相关帖子,但没有一个对我有用,所以我希望我没有错过一个(抱歉,如果我这样做)。
发布“Java ProcessBuilder process waiting for input”对我来说似乎最接近,但我在IDE的new Thread(new StreamGobbler("in", out, inStream)).start();
行感到悲伤,说明non-static variable this cannot be referenced from a static method
。
这是我最终运行的代码。当提示到达显示给用户的最后一个字符时,它只是停留在value = is.read();
(EOF可能?在可能的情况下,它询问用户目标是文件还是文件夹),我理解是因为输入流监听实际上并没有这样完成。
请注意,“xcopy”命令仅用于说明我的问题,实际命令行实际上可以是用户在我的应用程序中的字段中输入的任何命令行。
class Test {
public static void main(String[] args) {
try {
String command = "xcopy <file1.txt> <file2.txt> /L /Y";
//Following line is specific to Windows, where "cmd /c" should be
//pre-appended to have command line to properly work.
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", command);
pb.redirectErrorStream(true);
Process p = pb.start();
InputStreamPass isc = new InputStreamPass(p.getInputStream());
InputStreamPass errsc = new InputStreamPass(p.getErrorStream());
OutputStreamExport ose = new OutputStreamExport(p.getOutputStream());
ose.run();
errsc.run();
isc.run();
int exitCode = p.waitFor();
System.out.println("Exit code: " + exitCode);
} catch (SecurityException | IOException | InterruptedException | NullPointerException ex) {
System.err.println(ex);
}
}
private static class InputStreamPass implements Runnable {
private final InputStream is;
InputStreamPass(InputStream is) {
this.is = is;
}
@Override
public void run() {
try {
String message = "";
int value = is.read();
while (value != -1) {
System.out.print((char)value);
message += (char)value;
//Code blocks at following line when reaches
//end of prompt, waiting for user input, so value never
//gets to be assigned the final is.read() value
value = is.read();
}
System.out.println(message);
} catch (IOException ex) {
System.err.println(ex);
}
}
}//private static class InputStreamConsumer extends Thread
private static class OutputStreamExport implements Runnable {
private final OutputStream ots;
OutputStreamExport(OutputStream ots) {
this.ots = ots;
}
@Override
public void run() {
try {
ots.flush();
} catch (IOException ex) {
System.err.println(ex);
}
}
}//private static class InputStreamConsumer extends Thread
这是输出(本地化形式):
Est-ce que file2.txt désigne un nom de fichier ou un nom de répertoire de la destination (F = fichier, R = répertoire)ÿ?
-or rough back-translation:
Does file2.txt relates to the filename or the foldername of the target (F = file, D = directory)?
任何帮助都非常受欢迎(我已经3天搜索并测试无效):))