2017-11-29 3 views
1

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:

https://imgur.com/a/Is4Zb

Ich bin neu in der Stackoverflow-Plattform also, wenn es etwas gibt, ich bitte ändern sollte zeige es auf. Vielen Dank!

+0

So ist der sox12181 Ordner Verpackung ist nicht in den Topf in den Topf Wurzelstruktur sein wird, wenn Sie es erzeugen in Finsternis? – deFreitas

+0

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

+2

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

Antwort

1

Basierend auf @ Zingerella und @howlger Diskussion habe ich einige Tests dann nein, ist nicht möglich, eine ausführbare Datei in einem Glas ausführen, trotzdem habe ich eine Umgehungsmöglichkeit dafür, Sie können es bei this link arbeiten sehen. Im Grunde wird es die ausführbare Datei in einen SO temporären Ordner kopieren und dann ausführen. Mein Projekt wird mit gradle sowieso Sie es tun können using eclipse als auch die Folge Snippet bedenkt, dass die ausführbare Datei

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(); 
Verwandte Themen