【问题标题】:Java - Runtime.getRuntime().exec() Key eventJava - Runtime.getRuntime().exec() 关键事件
【发布时间】:2015-09-14 10:33:47
【问题描述】:

这是我的问题,我有一个必须做的 .bat :

@echo off
echo "Hello world!"
pause

我的回答是,当 java 程序使用 Runtime.getRuntime().exec(FullCommand )?

在我的 java 代码中,我使用所有通量(输入流、输出流、错误流,进入单独的线程) 我已经尝试使用 BufferedReader 来接听电话,但是如果我不使用输出流来模拟按键 Enter,则不会出现“Press Any Key” newLine();,因为进程不想结束。

所以我想知道是否有一个技巧可以知道进程何时等待,或者是否有办法在输入键方法之前捕获输入流“按任意键”,然后使用输出流方法(因为我不想对我运行的所有脚本使用此方法)。

1)Run Exec

proc = Runtime.getRuntime().exec(FullCommand);
try {
Ti = new Thread(new DisplayInputStream(proc.getInputStream())); 
Te = new Thread(new DisplayDebugStream(proc.getErrorStream()));

Ti.start();
Te.start();

proc.waitFor();
Ti.join();                                                      
Te.join();
}
......

2) InputStream 方法

BufferedReader br = getBufferedReader(inputStream);
setInfosProcess(null);
try {
    while ((StrInprocess = br.readLine()) != null) {
        if(???) //Condition Press Event key
        {
            Thread To;
            To = new Thread(new DisplayOutputStream(proc.getOutputStream()));
            To.start();
        }
        if (getInfosProcess() == null) {
            setInfosProcess(StrInprocess + "\n");
        } else {
            setInfosProcess(getInfosProcess() + StrInprocess + "\n");
        }
    }
} 
......

3)OutputStream方法

BufferedWriter bwr = getBufferedWriter(outputStream);
        setOutputProcess(null);

        try { 
            bwr.newLine();// Simulate pressing of the Enter key
            bwr.flush();// Flush the stream, otherwise it doesn't work
        } 
        ......

调试

        run:
        Hello world! Test:-1 //To compare string with what i want
        //"Press Any Key" from pause don't come
        //infinite loop caused by **pause**

请帮忙。

【问题讨论】:

    标签: java multithreading events runtime


    【解决方案1】:

    您可以逐个字符(或一次读取一组字符)而不是逐行阅读。

    BufferedReader br = getBufferedReader(inputStream);
    setInfosProcess(null);
    char[] cbuf = new char[1024]; // Adjust the length of the array to suit your needs.
    StringBuilder outputBuilder = new StringBuilder();
    try {
        while ((StrInprocess = br.read(cbuf)) != -1) {
             outputBuilder.append(cbuf); // You will get the "Press Any Key" text as soon as it appears.
             // Whatever you want to do here with the outputBuilder object...
        }
    } 
    

    【讨论】:

    • 嗨,问题是进程等待按键继续他必须做的事情(在这种情况下退出),所以缓冲区无法读取暂停之前的“按任意键”我用的是输出法,这真的很奇怪。
    • 你试过我的答案了吗?还是没有收到Press Any Key 文字?
    • 奇怪...您可能在其他地方有问题...我尝试了代码并且 outputBuilder 的文本 Press Any Key... 很好...
    • 我终于明白为什么这对我不起作用了,当我使用 br.read 和 outputBuilder 时,缓冲区中有一些 [null] 和空间,但句子的一部分是“ress”任何”所以,我只需要解决这个问题,那会很好。Ty 为您提供帮助。
    【解决方案2】:

    您将不得不聆听按键 了解 java.awt.event.KeyListener

    f.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
        }
    
        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("Key pressed code=" + e.getKeyCode() + ", char=" + e.getKeyChar());
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
        }
    });
    

    【讨论】:

    • 我不认为这是 op 要求的
    • KeyListener 会捕捉到我按下的键,但这不是我想要的,我只想捕捉到外部程序说我需要按下某些东西的输入。
    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 2011-02-22
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多