java - 在Java中调用命令行程序

标签 java

我正在使用 JavaFX 为命令行程序制作 GUI。

如果我只是将程序打包在.JAR中,我可以调用它吗?或者我需要先将程序提取到本地机器中,然后再进行处理吗?我问这个问题是因为 .JAR 是一个 ZIP 文件,我想您不能只运行 .JAR 中的文件,因为它是压缩的或其他什么的。

最佳答案

您必须分两步完成此操作:

  1. 提取二进制文件并将其写入磁盘(因为操作系统可能只能启动该程序,如果它是磁盘上的文件)

  2. 启动程序,最好使用ProcessBuilder

这是一个完整的演示:

测试.c

#include <stdio.h>

int main() {
    printf("Hello world\n");
    return 0;
}

测试.java

import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Collections;

public class Test {
    public static void main(String[] args) throws Exception {

        Path binary = Paths.get("mybinary");
        Files.copy(Test.class.getResourceAsStream("mybinary"), binary);

        System.out.println("Launching external program...");

        // Needed for Linux at least
        Files.setPosixFilePermissions(binary,
                Collections.singleton(PosixFilePermission.OWNER_EXECUTE));

        Process p = new ProcessBuilder("./mybinary").inheritIO().start();
        p.waitFor();
        System.out.println("External program finished.");
    }
}

演示

$ cc mybinary.c -o mybinary
$ ./mybinary
Hello world
$ javac Test.java
$ jar -cvf Test.jar Test.class mybinary
$ rm mybinary Test.class
$ ls
mybinary.c  Test.jar  Test.java
$ java -cp Test.jar Test
Launching external program...
Hello world
External program finished.

进一步阅读:

关于java - 在Java中调用命令行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30450362/

相关文章:

java - ActionBar 向上图标不起作用

Java,添加到数组列表如何工作

java - 在 Dom 中创建新 child

java - 如何在 Java 中将日期增加一天?

java - Spring Security 中的记住我服务

java - 如何使用 Struts 2 制作注册页面

java - 目标运行时 WildFly 在 maven 测试后解包

java - 如何在不使用tomcat的情况下运行jersey-server webservice服务器

java - 比 JTable 效率更高的对象

java - 无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/JDBC_DBO]]