View Full Version : leseguire un programma da java
è possibile con il java eseguire un file, allego un esempio che feci in c (questo serviva per eseguire in linux un file audio da un programma scritto in c e testava prima se il file esisteva)
printf("\n");
test_file=open("pippo.wav",O_RDONLY);
if(test_file!=-1) // file aperto con successo
{
close(test_file);
system("play pippo.wav");
}
// else
// printf("errore apertura file 'pippo.wav'\n");
io dovrei fare dopo aver verificato se il file esiste:
programmaeseguibile filedaaprire.xxx > output.txt
:help:
In Java 6
if(file.exists()) {
Desktop.open(file);
}
Per versioni precedenti... è uguale, devi solo includere le librerie JDIC.
yorkeiser
10-05-2007, 10:45
Oppure, se ti serve qualcosa di modulare, lo compili come dll e lo richiami tramite JNI
In Java 6
if(file.exists()) {
Desktop.open(file);
}
Per versioni precedenti... è uguale, devi solo includere le librerie JDIC.
dovrei fare così ???
String file="filedaaprire.xxx"
if(file.exists()) {
Desktop.open(programmaeseguibile filedaaprire.xxx > output.txt);
}
puoi dirmi quali sono le librerie da aggiungere io ho java 1.5.0_11
n.b. programmaeseguibile è un eseguibile x ms-dos
Se usi Java 5 devi scaricare JDIC (è il nome di una libreria, Java Desktop Integration Component).
https://jdic.dev.java.net/
Penso tuttavia che ti convenga passare a Java 6. Non è solo una questione di librerie, ci sono anche tante novità nel sistema che rendono realmente vantaggioso il passaggio, anche a costo di scavalcare il motto entreprise "oggi meno tre".
Quel che Desktop.open fa è chiedere al desktop manager di "fare quello che di solito farebbe con quel file".
Non so come si comporti Windows con gli eseguibili DOS. Ma se li esegue allora li esegue anche Desktop.
Se usi Java 6, il codice è quello che ho indicato e che specifico maggiormento qui:
File file = new File(...);
if(file.exists()) {
try {
java.awt.Desktop.open(file);
} catch(IOException ex) {
ex.printStackTrace();
}
}
Se usi Java 5 e JDIC allora cambia solo il nome del package di Desktop:
File file = new File(...);
if(file.exists()) {
try {
org.jdesktop.jdic.desktop.Desktop.open(file);
} catch(IOException ex) {
ex.printStackTrace();
}
}
P.s.: se ti interessa catturare l'output del programma dos allora Desktop non va più bene e dei passare a ProcessBuilder.
P.s.: se ti interessa catturare l'output del programma dos allora Desktop non va più bene e dei passare a ProcessBuilder.
puoi per favore farmi un esempio? grazie!!!
poco pensato ma funziona. Qui si suppone che nella directory di lavoro esista un programma "ponziponzo.bat". Il programma Java lancia un processo che esegue quel programma e ne cattura l'output. L'output è catturato da OutputGrabber in un Thread a parte. Quell'output è poi rispedito allo standard output il che parifica l'utilità di questo programma ad una forchetta senza denti.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
File workingDir = new File(System.getProperty("user.dir"));
ProcessBuilder processBuilder = new ProcessBuilder("ponziponzi.bat");
try {
Process process = processBuilder.start();
new OutputGrabber(process.getInputStream());
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
class OutputGrabber {
private final Scanner IN;
private final Thread RUNNER;
public OutputGrabber(InputStream in) {
IN = new Scanner(in);
RUNNER = new Thread(TASK);
RUNNER.start();
}
private final Runnable TASK = new Runnable() {
public void run() {
try {
while(IN.hasNextLine()) {
System.console().printf("Grab line: %s%n", IN.nextLine());
}
} finally {
IN.close();
}
}
};
}
nel mio caso l'output del programma avviene soltanto facendo così
programmaeseguibile filedaaprire.xxx > output.txt
esempio se il programma è pippo.exe devo fare
pippo ciccio.zzz > finito.txt
è praticamente un programma a linea di comando che funziona nel modo che ti ho detto, il file txt lo genera lui utilizzando "> output.txt"
come posso adattare "pippo ciccio.zzz > finito.txt" per farlo eseguire al mio programma java!!!
grazie!!! ;)
Con ProcessBuilder sarebbe:
ProcessBuilder processBuilder = new ProcessBuilder("pippo", "ciccio.zzz", ">", "finito.txt");
processBuilder.start();
ho provato
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
File workingDir = new File(System.getProperty("user.dir"));
ProcessBuilder processBuilder = new ProcessBuilder("ponziponzi.bat");
try {
Process process = processBuilder.start();
// new OutputGrabber(process.getInputStream());
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
ma risulta questo errore
Main.java:8: cannot find symbol
symbol : constructor ProcessBuilder(java.lang.String)
location: class java.lang.ProcessBuilder
ProcessBuilder processBuilder = new ProcessBuilder("ponziponzi.bat");
^
1 error
inoltre se volessi verificare l'effettiva esistenza del file ponziponzi.bat come fare???
:help:
Dai un'occhiata alla documentazione java di ProcessBuilder per Java 5 perchè io ora ho sottomano solo quella di Java 6 e mi dice che quel costruttore c'è (e c'era anche prima).
aenema82
12-05-2007, 16:52
io farei così:
import java.lang.*;
{
...
Process p;
try {
p = Runtime.getRuntime().exec("file.exe");
p.waitFor();
}
catch(Exception e){ return;}
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
...
}
spero ti giri, mi pare che i metodi siano in jdk 1.5
CIAO!
x aenema82 ... ho dovuto mettere pippo al posto di p perche avavo l'errore: p is already defined in main(java.lang.String[]), cmq così funziona grazie!!!
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main {
public static void main(String[] args) {
Process p;
try {
Process pippo;
pippo = Runtime.getRuntime().exec("notepad.exe");
pippo.waitFor();
}
catch(Exception e) {return;}
// InputStreamReader isr = new InputStreamReader(p.getInputStream());
// BufferedReader br = new BufferedReader(isr);
}
}
x PGI-Bis
Dai un'occhiata alla documentazione java di ProcessBuilder per Java 5 perchè io ora ho sottomano solo quella di Java 6 e mi dice che quel costruttore c'è (e c'era anche prima).
ho trovato questo ma non mi è chiaro, cosa è Map<String, String> ???
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html
come dovrei modificare il codice (che riporto sotto) che mi hai inviato e dava l'errore
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
File workingDir = new File(System.getProperty("user.dir"));
ProcessBuilder processBuilder = new ProcessBuilder("ponziponzi.bat");
try {
Process process = processBuilder.start();
// new OutputGrabber(process.getInputStream());
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
grazie!!! :help:
Il tuo codice è corretto.
Se usi un IDE, controlla che le opzioni del progetto non dichiarino la compatibilità con la versione 1.4 di Java.
Altrimenti controlla di non avere l'opzione "-source 1.4" tra quelle di compilazione.
ho provato con NetBeans 5.5 e funziona!!! :D
grazie!!! ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.