PDA

View Full Version : [Java] Eseguire comandi da shell


Unrue
06-12-2006, 15:16
Salve, ho bisogno di eseguire da un programma Java un comando da console. Ad esempio quello che fa venire la versione della jdk ovvero java -version. A tal proposito ho scritto:

package comandi;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;

public class Comandi {

/**
* @param args
*/
public static void main(String[] args) {
Process cmd;
String[] a= {"/bin/sh","java","-version"};
try{
cmd = Runtime.getRuntime().exec(a);
PrintStream cmdin = new PrintStream(new BufferedOutputStream(
cmd.getOutputStream()));
System.out.println(cmd.toString());
DataInputStream cmdout = new DataInputStream(new BufferedInputStream(
cmd.getInputStream()));
}
catch (IOException e)
{


}
}

}

Ma come output ottengo:

java.lang.UNIXProcess@10b62c9

Cosa vuol dire? Probabilmente sbaglio a passare i comandi in quel modo. In realtà il mio comando deve poi richiamare un programma, ma adesso per imparare gli sto mandando comandi di shell semplici. Grazie.

VICIUS
06-12-2006, 16:31
Prova a stampare cmdin che è il PrintStream.

ciao ;)

Unrue
06-12-2006, 19:54
Prova a stampare cmdin che è il PrintStream.

ciao ;)

Già provato,cambia solo il messaggio di output :( :

java.io.PrintStream@10b62c9

VICIUS
06-12-2006, 20:15
Guardando su qualche esempio online dice di ricordarsi di chiudere lo stream con la close(). Purtroppo non ho java sotto mano e più di cosi non posso aiutarti :(

ciao ;)

Unrue
06-12-2006, 20:51
Guardando su qualche esempio online dice di ricordarsi di chiudere lo stream con la close(). Purtroppo non ho java sotto mano e più di cosi non posso aiutarti :(

ciao ;)


Allora, ci sono quasi.
Il comando che inserisco è questo:

String[] a= {"sh","-c","java","-version"};

Però non mi prende l'argomento "-version" , mi esegue il comando java e mi dà tutta la lista dei possibili argomenti.

lovaz
07-12-2006, 09:07
Come comando basta una stringa:
String a = "java -version";

Poi per leggere lo stdout - similmente per stderr - devi fare:
BufferedReader brSTDOUT = new BufferedReader(new InputStreamReader(p.getInputStream()));
(non e' necessario il wrap Buffered, comunque...)

Per stamparlo:

String s;
while(true) {
s = brSTDOUT.readLine();
if(s == null)
break;
System.out.println(s);
}

Se vuoi anche il codice di uscita:

System.out.println("\n\nCodice di uscita: " + p.waitFor());

andbin
07-12-2006, 12:49
Ecco una possibile soluzione per "catturare" l'output del processo avviato (nell'esempio java -version su Windows):

import java.io.*;
import java.util.regex.*;

public class Prova
{
public static void main (String[] args)
{
try
{
Runtime rt = Runtime.getRuntime ();
Process proc = rt.exec (new String[] { "cmd", "/C", "java", "-version" });

InputStreamGrabber isgOut = new InputStreamGrabber (proc.getInputStream ());
InputStreamGrabber isgErr = new InputStreamGrabber (proc.getErrorStream ());

int exitVal = proc.waitFor ();

Pattern pattern = Pattern.compile ("java version \"(.*)\"", Pattern.DOTALL);
Matcher matcher = pattern.matcher (isgErr.getString ());

if (matcher.find ())
System.out.println ("Versione di Java: " + matcher.group (1));
}
catch (Exception e)
{
System.out.println (e);
}
}
}


class InputStreamGrabber implements Runnable
{
private InputStream is;
private StringBuffer sb;

public InputStreamGrabber (InputStream is)
{
this.is = is;
sb = new StringBuffer ();

new Thread (this).start ();
}

public void run ()
{
try
{
InputStreamReader isr = new InputStreamReader (is);

char[] buf = new char [256];
int len;

while ((len = isr.read (buf)) != -1)
sb.append (buf, 0, len);
}
catch (Exception e)
{
System.out.println (e);
}
finally
{
try {
is.close ();
} catch (Exception e) { }
}
}

public String getString ()
{
return sb.toString ();
}
}

lovaz
07-12-2006, 12:52
...
(non e' necessario il wrap Buffered, comunque...)
...
Anzi si', se vuoi usare readLine().

Unrue
07-12-2006, 13:00
Grazie delle risposte. Ho risolto. :)