【问题标题】:Calling a command line program in Java在 Java 中调用命令行程序
【发布时间】:2015-05-26 05:46:40
【问题描述】:

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

如果我只是将程序打包到 .JAR 中,我可以调用它吗?还是需要先把程序解压到本地机器再做进程?我问是因为 .JAR 是一个 ZIP 文件,我想你不能只在 .JAR 中运行一个文件,因为它是压缩的或其他东西。

【问题讨论】:

  • 你要启动的命令行程序,是Java程序吗?还是像原生二进制文件一样?
  • @aioobe 本机二进制
  • 然后是操作系统启动程序。除非有问题的操作系统能够从 zip 文件中启动程序(我对此表示怀疑),否则您必须在启动之前提取二进制文件并将其写入磁盘。
  • 这是一个很好的问题,我可以想象未来的访问者会遇到类似的用例,所以我花时间写了一个详尽的答案。

标签: java


【解决方案1】:

您必须分两步完成:

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

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

这是一个完整的演示:

test.c

#include <stdio.h>

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

Test.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.

进一步阅读:

【讨论】:

    【解决方案2】:

    你必须先提取你的程序让操作系统执行它。没有办法将它“流式传输”到 ram 并从那里执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2019-05-30
      • 2015-06-15
      相关资源
      最近更新 更多