gpt4 book ai didi

java - 在java中执行外部命令行实用程序并将其打包到可运行的jar中

转载 作者:行者123 更新时间:2023-11-30 06:24:07 25 4
gpt4 key购买 nike

我正在尝试构建一个使用 sox 的程序用于将 .dat 文件转换为 .wav 文件的命令行实用程序。

我的方法是创建一个 .bat 脚本并运行它。这在 Eclipse 中有效,但是当将其导出并打包到可执行 jar 文件中时,它会失败。这可能是由于两个问题造成的。

第一个可能是从 jar 文件中访问 sox.exe 甚至我自己的目录。

另一个是打包 sox12181 文件夹,其中包含 sox 需要运行的文件以及 jar 文件中的 sox.exe 本身。我搜索了如何打包它,只找到了在资源中打包图像的示例。

这是我的代码:

package executableIII;

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;

public class SoundManipulation {

public static void main(String[] args) throws IOException {
Queue<Double> queue1 = new LinkedList<>();
Queue<Double> queue2 = new LinkedList<>();
StringBuilder sb = new StringBuilder();
double sampleRate = 44100;
int m = (int) (sampleRate * 3);
int n = 700;
for (int i = 0; i < n; i++) {
queue1.add((Math.random() * 2) - 1);
}
queue2.add(0.0);
for (int i = 0; i < m; i++) {
double a = queue1.remove();
double b = queue2.remove();
double c = 0.99 * (a + b) / 2;
queue1.add(c);
queue2.add(a);
sb.append(i * (1 / sampleRate) + " " + c + "\n");
}
FileOutputStream fs = new FileOutputStream(System.getProperty("user.dir") + "\\sox12181\\generated.dat");
OutputStreamWriter out = new OutputStreamWriter(fs);
out.write("; Sample Rate 44100\n; Channels 1\n");
out.write(sb.toString());
out.close();
fs.close();
try {
FileOutputStream fsExec = new FileOutputStream("converter.bat");
OutputStreamWriter outExec = new OutputStreamWriter(fsExec);
outExec.write("cd " + System.getProperty("user.dir") + "\\sox12181\nsox generated.dat generated.wav");
outExec.close();
fsExec.close();
} catch (IOException e) {
System.err.println(e);
}
File temp1 = new File("converter.bat");
Desktop.getDesktop().open(temp1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
File temp2 = new File("sox12181\\generated.wav");
Desktop.getDesktop().open(temp2);
}
}

这是我的程序中路径的屏幕截图:

https://imgur.com/a/Is4Zb

我是 stackoverflow 平台的新手,因此如果有什么需要更改的地方,请指出。谢谢!

最佳答案

根据@zingerella和@howlger的讨论,我做了一些测试,然后不,不可能在jar内执行可执行文件,无论如何我为此做了一个解决方法,你可以看到它在 this link 工作。 。基本上它会将可执行文件复制到 SO 临时文件夹,然后执行它。我的项目正在使用 gradle 无论如何你都可以这样做 using eclipse同样,以下代码片段将认为您的可执行文件将位于 jar 根结构中

final InputStream in = Main.class.getResourceAsStream("/myprogram");
if (in == null) {
throw new RuntimeException("program not found");
}

final File tmpProgram = Files.createTempFile("mypgrogram", ".tmp").toFile();
Files.copy(in, tmpProgram.toPath(), StandardCopyOption.REPLACE_EXISTING);
tmpProgram.deleteOnExit();
tmpProgram.setExecutable(true);

final Process p = Runtime.getRuntime().exec(tmpProgram.getAbsolutePath());
System.out.println(p.waitFor());

for (int c; (c = p.getInputStream().read()) != -1; ) {
System.out.print((char) c);
}
System.out.println();

for (int c; (c = p.getErrorStream().read()) != -1; ) {
System.out.print((char) c);
}
System.out.println();

关于java - 在java中执行外部命令行实用程序并将其打包到可运行的jar中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47562300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com