Java - Datei aus Classpath ausführen

02/12/2016 09:05 Bombasticx3#1
Hey Com,

ich möchte eine eigenständige .exe auf Knopfdruck ausführen.
Dabei hab ich das Problem, wenn ich das Programm zu einer .jar mache, dann liegt die Datei.exe drin.
Aber wie kann ich die Datei.exe nun aus diesem ausführen, sodass ich egal an welchem PC diese einfach ausführen kann und nicht immer einen neuen Pfad angeben muss?

Die Datein liegen so zusammen in der IDE:

[Only registered and activated users can see links. Click Here To Register...]

Probiert habe ich getResourceStream(String), aber dies liest nur die Datei, aber führt diese nicht aus.

Danke schonmal im Vorraus.

MfG Bombasticx3
02/12/2016 11:09 ComputerBaer#2
Ich denke du wirst die Datei erst auf die Festplatte schreiben und dann dort ausführen müssen, es würde mich wundern wenn die JavaRuntime plötzlich fremde Programmiersprachen ausführen kann.

Egal auf welchem PC gilt allerdings auch nicht, außer PC bedeutet für dich Windows.

Edit:
Windows kann Programme doch auch ausführen, wenn die in einem zip-Archiv stecken und eine jar-Daet ist da nichts anderes. Allerdings weiß ich nicht ob das so einfach funktioniert, vermutlich entpackt Windows die Datei dann trotzdem vorher irgendwohin. Es wäre also am besten, wenn du sie selbst irgendwo ablegst.
02/12/2016 15:37 Bombasticx3#3
Quote:
Originally Posted by ComputerBaer View Post
Ich denke du wirst die Datei erst auf die Festplatte schreiben und dann dort ausführen müssen, es würde mich wundern wenn die JavaRuntime plötzlich fremde Programmiersprachen ausführen kann.

Egal auf welchem PC gilt allerdings auch nicht, außer PC bedeutet für dich Windows.

Edit:
Windows kann Programme doch auch ausführen, wenn die in einem zip-Archiv stecken und eine jar-Daet ist da nichts anderes. Allerdings weiß ich nicht ob das so einfach funktioniert, vermutlich entpackt Windows die Datei dann trotzdem vorher irgendwohin. Es wäre also am besten, wenn du sie selbst irgendwo ablegst.
Ja, dass jar ein Archiv ist und Windows Datein aus einem Archiv ausführen kann, weiß ich ja.
Wenn ich die Datei aus dem Archiv entpacke und sie in einen temporären Pfad speichere und von dort aus mit Runtime ausführe und beim schließen des Programmes den Pfad wieder lösche, wäre auch eine Möglichkeit.
Wäre das mit Java möglich?
02/12/2016 15:52 Mysthik#4
Quote:
Originally Posted by Bombasticx3 View Post
Wäre das mit Java möglich?
Ja wie du bereits festgestellt hast, kannst du die Datei als InputStream lesen.

Verfahren währe dann folgendes:
Code:
1. InputStream öffnen
2. Datei im Temppfad erstellen (am besten Dateiname-TimeStamp.exe) und OutputStream erstellen
    (schau dir dafür mal die File.createTempFile(String prefix, String suffix) Funktion an)
3. Solange InputStream.read nicht am Ende
    lese byte[] von Input und schreibe byte[] in output
4. Führe Datei aus.
5. Lösche Datei wieder.
02/12/2016 16:09 Bombasticx3#5
Quote:
Originally Posted by Mysthik View Post
Ja wie du bereits festgestellt hast, kannst du die Datei als InputStream lesen.

Verfahren währe dann folgendes:
Code:
1. InputStream öffnen
2. Datei im Temppfad erstellen (am besten Dateiname-TimeStamp.exe) und OutputStream erstellen
    (schau dir dafür mal die File.createTempFile(String prefix, String suffix) Funktion an)
3. Solange InputStream.read nicht am Ende
    lese byte[] von Input und schreibe byte[] in output
4. Führe Datei aus.
5. Lösche Datei wieder.
D.h. also
Code:
 1. InputStream stream = BotMain.class.getResourceAsStream("/Bot/Fishingbot.exe"); //InputStream
2. leere .exe erstellen
3.in ner for-Schleife die Bot.exe in Bot_copy.exe schreiben
4. runtime ausführen
5. löschen
Bin nun soweit:

Code:
 public static void copy() throws IOException {
        File fSrc = new File("/Main/Fishingbot.exe"); // Quelldatei 
        File fDes = new File(createTempFile("bot", "exe").getAbsolutePath()); // Zieldatei
        FileInputStream fis = new FileInputStream(fSrc); //Stream fuer Quelldatei
        FileOutputStream fos = new FileOutputStream(fDes); //Stream fuer Zieldatei
        byte buf[] = new byte[1024]; // Buffer für gelesene Daten
        while (fis.read(buf) != -1) { // solange lesen, bis EOF
            fos.write(buf); // Inhalt schreiben
        }
        fis.close();
        fos.flush();
        fos.close();
    }
Dies funktioniert nicht, da die Zieldatei nicht gefunden werden kann.
(new File(String) sucht nicht im claspath).
Ich kann die Datei nur als InputStream finden.
Aber hier brauch ich einen FileInputStream.
Wer ne Idee?

#edit:

Habs geschafft.

Code:
 public static void copy() throws IOException {
        File fSrc = new File("src/Main/Fishingbot.exe"); // Quelldatei 
        File fDes = new File(createTempFile("bot", "exe").getAbsolutePath()); // Zieldatei
        FileInputStream fis = new FileInputStream(fSrc); //Stream fuer Quelldatei
        FileOutputStream fos = new FileOutputStream(fDes); //Stream fuer Zieldatei
        byte buf[] = new byte[1024]; // Buffer für gelesene Daten
        while (fis.read(buf) != -1) { // solange lesen, bis EOF
            fos.write(buf); // Inhalt schreiben
        }
        fis.close();
        fos.flush();
        fos.close();
    }