Ich versuche, ein Programm zu erstellen, das Befehlszeilenprogramm verwendet, um eine .dat-Datei in eine WAV-Datei zu konvertieren.Ausführen von externen Befehlszeilen-Dienstprogramm in Java und packen es in runnable Jar
Meine Vorgehensweise bestand darin, ein .bat-Skript zu erstellen und auszuführen. Dies funktioniert in Eclipse, aber beim Exportieren und Packen in eine ausführbare JAR-Datei schlägt es fehl. Dies ist wahrscheinlich auf zwei Probleme zurückzuführen.
Die erste würde wahrscheinlich Zugriff auf die sox.exe und sogar mein eigenes Verzeichnis aus der JAR-Datei.
Die andere wäre Verpackung der sox12181-Ordner, der die Dateien enthält, die sox benötigt, und sox.exe selbst in der JAR-Datei ausführen. Ich habe gesucht, wie man es verpacken kann und fand nur Beispiele, die Bilder innerhalb der Betriebsmittel verpacken.
Hier ist mein Code:
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);
}
}
Hier ist ein Screenshot der Pfade in meinem Programm:
Ich bin neu in der Stackoverflow-Plattform also, wenn es etwas gibt, ich bitte ändern sollte zeige es auf. Vielen Dank!
So ist der sox12181 Ordner Verpackung ist nicht in den Topf in den Topf Wurzelstruktur sein wird, wenn Sie es erzeugen in Finsternis? – deFreitas
Nein, dies ist ein Problem beim Packen von Benutzerressourcen. Mein Hauptanliegen ist, wenn selbst wenn ich in der Lage, es zu verpacken, wie kann ich Befehlseingabeaufforderung Zugriff auf die sox.exe Kommandozeilen-Dienstprogramm und führen Sie die "sox generated.dat generierte.wav" Befehl – Zingerella
Ich habe einige Tests dann nein, ist nicht möglich, eine ausführbare Datei in einem Jar auszuführen, trotzdem habe ich eine Workaround dafür gemacht, dass es funktioniert [unter diesem Link] (https://github.com/mageddo/execute-binary/blob/master/src/main/ java/com/mageddo/Main.java). Im Grunde wird es die ausführbare Datei in einen temporären Ordner kopieren und ausführen. Mein Projekt verwendet grittle sowieso Sie können es auch mit eclipse auf die gleiche Weise tun – deFreitas