Forum: PC-Programmierung Java - externes Programm starten


von Markus H. (gammeltante)


Lesenswert?

Grüß euch zusammen,

ich möchte mit einem Java Programm smartmontools aufrufen und 
anschließend die Daten zum Festplattenstatus auslesen und 
weiterverarbeiten.
Da es sich um mein erstes Java Projekt handelt habe ich mal wie folgt 
begonnen (siehe Code unten).

Ich möchte erst mal einfach nur ein externes Programm durch mein 
Java-Programm starten.

Zuerst war ich unsicher ob die Methoden funktionieren, deshalb die 
"print" Anweisung. Da sich nichts geöffnet hat hab ich es mit der 
Test.txt probiert. Wenn ich "cmd /c start C:\\smartmontools\\TEST.txt" 
in die Console tippe wird es geöffnet. Durch mein Java Programm 
allerdings nicht???


1
package progopen;
2
3
public class ProgOpen {
4
5
    public static void main(String[] args)
6
    {
7
        if (isWindowsSystem())
8
        {
9
            System.out.println("Windows System");
10
            execWindowsProgram("C:\\smartmontools\\bin\\smartctl.exe");
11
            execWindowsProgram("C:\\smartmontools\\TEST.txt");   
12
        }
13
        else
14
        {
15
            if(isLinuxSystem())
16
            {
17
                System.out.println("Linux System");
18
            }
19
            else
20
                    {
21
                System.err.println("Unknown System");
22
                System.exit(1);
23
                    }
24
        }
25
    }
26
       static boolean isWindowsSystem()
27
       {
28
           String osName = System.getProperty("os.name").toLowerCase();
29
           return osName.indexOf("windows") >= 0;
30
       }
31
       static boolean isLinuxSystem()
32
       {
33
           String osName = System.getProperty("os.name").toLowerCase();
34
           return osName.indexOf("linux") >= 0;
35
       }
36
       static void execWindowsProgram(String command) //throws Exception
37
       {
38
           try{
39
            Runtime.getRuntime().exec("cmd /c start" + command);
40
            Runtime.getRuntime().exec("cmd /c start" + command + "-a/dev/hda");
41
            System.out.println("Jetzt hat er was getan...");
42
       }
43
           catch(Exception e)
44
           {
45
               System.out.println("Programm nicht gefunden");
46
           }
47
       }
48
}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Dafür gibt es den ProcessBuilder:

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html

Am besten mittesl redirectErrorStream(true) stin auf stdout umleiten und 
dann Aus dem Outputstream auf Stdout schreiben um zu sehen ob das 
Programm ggf. Fehlerausgaben macht.

Markus H. schrieb:
> Runtime.getRuntime().exec("cmd /c start" + command);

Hier fehlt zudem ein leerzeichen wenn ich das richtig sehe... Der 
Prozessbuilder ist aber trotzdem zu empfehlen, da hier die Argumente 
explizit gesetzt werden und solche Fehler garnicht passieren können.

von Markus H. (gammeltante)


Lesenswert?

Hallo Läubi,

vielen Dank für deine Antwort.
Leider sind meine Java Kenntnisse noch relativ gering. Ich habe versucht 
den Process Builder anzuwenden. Leider ist mir das nicht so ganz 
gelungen.
Ich bin jetzt vor lauter "environment" und "directory" total verwirrt 
und weiß nicht wie ich den ProcessBuilder anwenden kann.
Könntest du das bitte nochmal genauer erklären? Oder vllt ein kleines 
Beispiel machen?


> Runtime.getRuntime().exec("cmd /c start" + command);
Wo fehlt hier ein Leerzeichen?

Grüße
Markus H.

von Markus H. (gammeltante)


Lesenswert?

Haaaalllt... Ich bin blind...

Natürlich habe ich ein Leerzeichen vergessen!
Richtig ist:

Runtime.getRuntime().exec("cmd /c start " + command)

Danke!

von Peter II (Gast)


Lesenswert?

du kannst das cmd auch weglassen, man kann doch einfach so programm 
starten.

von Tobi L (Gast)


Lesenswert?

ich weiss auch nicht ob er check auf "windows" so gut ist weil er bei 
mir zb."windows 7" auspucken würde

von Markus H. (gammeltante)


Lesenswert?

Hallo Peter II,
also ich weiß nicht genau warum, aber ohne "cmd" funktioniert es bei mir 
nicht. Ich habe auch gelesen, dass es unter Windoof ohne nicht geht.


Inzwischen habe ich weitergewurschtelt und bin bei folgendem Status 
angelangt:

- Programmstart funktioniert
- Einlesen der Daten funktioniert nicht...

Hier mein aktueller Code:
1
package progopen;
2
import java.io.*;
3
4
public class ProgOpen
5
{
6
    public static void main(String[] args)
7
    {
8
        if (isWindowsSystem())
9
        {
10
            System.out.println("Windows System");
11
            printWindowsCommand("C:\\smartmontools\\bin\\smartctl.exe");
12
         }
13
        else
14
        {
15
            if(isLinuxSystem())
16
            {
17
                System.out.println("Linux System");
18
            }
19
            else
20
                    {
21
                System.err.println("Unknown System");
22
                System.exit(1);
23
                    }
24
        }
25
    }
26
       static boolean isWindowsSystem()
27
       {
28
           String osName = System.getProperty("os.name").toLowerCase();
29
           return osName.indexOf("windows") >= 0;
30
       }
31
       static boolean isLinuxSystem()
32
       {
33
           String osName = System.getProperty("os.name").toLowerCase();
34
           return osName.indexOf("linux") >= 0;
35
       }
36
       static void execWindowsProgram(String command) 
37
       {
38
           try
39
           {
40
           ProcessBuilder pb = new ProcessBuilder(command);
41
            Runtime.getRuntime().exec("cmd /c start " + command);
42
            Process p = new ProcessBuilder("myCommand", "myArg").start();
43
            System.out.println(p.getInputStream());
44
            System.out.println("Aufruf: execWindowsProgram Methode");
45
       }
46
           catch(Exception e)
47
           {
48
               System.out.println("Programm nicht gefunden");
49
           }
50
       }
51
       static void printWindowsCommand(String command)        {
52
           try
53
           {
54
           System.out.println("Windows command: " + command);
55
           String line;
56
           Process process = Runtime.getRuntime().exec("cmd /c " + command + "-a /dev/hda");
57
           Reader r = new InputStreamReader(process.getInputStream());
58
           BufferedReader in = new BufferedReader(r);
59
           while((line = in.readLine()) != null) System.out.println(line);
60
           in.close();
61
           System.out.println("Aufruf: printWindowsCommand");
62
           }
63
           catch(Exception e)
64
           {
65
               System.out.println("Programm und inputStream nicht gefunden");
66
           }
67
       }
68
}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Markus H. schrieb:
> Könntest du das bitte nochmal genauer erklären? Oder vllt ein kleines
> Beispiel machen?

Probier es mal so:
1
  public static void main(String[] args) throws IOException {
2
    File program = new File("C:\\smartmontools\\bin\\smartctl.exe");
3
    if (!program.exists()) {
4
      System.err.println("File not found! " + program);
5
      return;
6
    }
7
    ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "start", program.toString());
8
    builder.redirectErrorStream(true);
9
    System.out.println("Starting process...");
10
    Process process = builder.start();
11
    InputStream stream = process.getInputStream();
12
    System.out.println("Reading output:");
13
    int i;
14
    while ((i = stream.read()) > -1) {
15
      System.out.print((char) i);
16
    }
17
    System.out.println("\r\nProcess exited with code " + process.exitValue());
18
  }

Markus H. schrieb:
> Ich bin jetzt [...] total verwirrt
Versuch es erstmal mit einem einfachem Beispiel (wie z.B. oben) und hau 
alles raus was du nicht unbedingt benötigt z.B. die Win/Linux checkt, 
geh stück für stück vor und vorallem mal etwas in der Java API der 
verwendeten Klassen stöbern, da stehen oft Beispiele und Tips drinnen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.