|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6922
|
[Java] Eseguire comandi da shell
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:
Codice:
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)
{
}
}
}
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. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Prova a stampare cmdin che è il PrintStream.
ciao |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6922
|
Quote:
java.io.PrintStream@10b62c9 |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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 |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6922
|
Quote:
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. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
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: Codice:
String s;
while(true) {
s = brSTDOUT.readLine();
if(s == null)
break;
System.out.println(s);
}
System.out.println("\n\nCodice di uscita: " + p.waitFor());
__________________
|Java Base| |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ecco una possibile soluzione per "catturare" l'output del processo avviato (nell'esempio java -version su Windows):
Codice:
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 ();
}
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
__________________
|Java Base| |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6922
|
Grazie delle risposte. Ho risolto.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:41.











|








