1

我正在编写一个库来涵盖 WMctrl shell 程序。我在调整窗口大小时遇到​​问题:

String command = "wmctrl -r \"Calculator\" -e 0,100,100,500,500";

System.out.println(command);
String output = this.bashCommandExecutor.execute(command);
System.out.println(output);

这不起作用 -输出变量为空。但是当我将wmctrl -r "Calculator" -e 0,100,100,500,500复制粘贴到终端时,它可以正常工作。

其他命令,如“ wmctrl -d ”和“ wmctrl -l ”在this.bashCommandExecutor.execute()方法中工作。

此方法如下所示:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BashCommandExecutor
{
    String execute(String bashCommand)
    {
        Process p = null;
        try {
            p = Runtime.getRuntime().exec(bashCommand);
            p.waitFor();
        }
        catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }

        BufferedReader reader = new BufferedReader(
            new InputStreamReader(p.getInputStream())
        );

        String line = "";
        StringBuilder sb = new StringBuilder();
        try {
            while ((line = reader.readLine())!= null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }
}

为什么调整大小在命令行中起作用,但在 Java 应用程序中不起作用?

4

1 回答 1

0

我发现使用 ProcessBuilder 类而不是 Runtime.exec() 可以运行您描述的 wmctrl 命令。所以而不是:

String bashCommand = "wmctrl -r \"Calculator\" -e 0,100,100,500,500";
Process p = Runtime.getRuntime().exec(bashCommand);

你可以试试:

String bashCommand = "wmctrl -r \"Calculator\" -e 0,100,100,500,500";
ProcessBuilder pb = new ProcessBuilder("bash", "-c", bashCommand);
Process p = pb.start();

这是另一篇文章的链接,解释了 Runtime.exec() 和使用 ProcessBuilder 之间的区别。

于 2021-10-07T21:19:59.353 回答