Salut,
C'est normal.
Lorsque tu utilises un shell, la ligne de commande peut être passé en un seul et unique paramètre (c'est même mieux en fait dans ce cas, car tu peux passer exactement la même chose que tu tapes en ligne de commande).
@ddiop : le problème vient sûrement du fait que tu ne traites pas les flux du process.
Du coup tu ne peux pas voir une éventuelle erreur.
Pire : ces flux utilisent de petit buffer qui pourraient se remplir et bloquer la commande !
Il faut lire les flux (et en parallèle sinon il peut encore y avoir des risque de blocage), ou fermer ceux qu'on ne va pas utiliser (comme stdin dans la plupart des cas)
Si tu tournes sous
Java 5 ou plus, je te conseillerais plutôt d'utiliser
ProcessBuilder à la place de
Runtime, car il te permet de fusionner les flux stdout/stderr (ce qui fait qu'il n'y a qu'un seul flux à lire).
Par exemple ici en sortant le tout sur la console :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
.redirectErrorStream(true);
Process process = builder.start();
// On ferme le flux inutilisé (stdin)
process.getOutputStream().close();
// On lit de sortie du process (stdout)
// ainsi que le flux d'erreur (stderr)
// qui a été redirigé dans le même flux via redirectErrorStream() :
InputStream input = process.getInputStream();
try {
byte[] buf = new byte[512];
int len;
while ( (len=input.read(buf)) > 0 ) {
System.out.write(buf, 0, len);
}
System.out.flush();
} finally {
input.close();
} |
A partir de
Java 7 tu as même des fonctionnalités plus poussé, comme le fait d'hériter automatiquement des flux du process Java.
Par exemple ici les flux stdin/stdout/stderr de la commande seront les mêmes que ceux du programme Java. Il n'y a donc rien à faire de plus :
1 2 3
| new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
.inheritIO()
.start(); |
Ou même de rediriger automatiquement un (ou plusieurs flux) dans des fichiers :
1 2 3 4
| new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
.inheritIO()
.redirectError(new File("error.log"))
.start(); |
a++
Partager