PDA

View Full Version : leseguire un programma da java


hello
10-05-2007, 09:33
è 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:

PGI-Bis
10-05-2007, 10:22
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

hello
10-05-2007, 12:10
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

PGI-Bis
10-05-2007, 12:22
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();
}
}

PGI-Bis
10-05-2007, 12:23
P.s.: se ti interessa catturare l'output del programma dos allora Desktop non va più bene e dei passare a ProcessBuilder.

hello
10-05-2007, 12:33
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!!!

PGI-Bis
10-05-2007, 12:52
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();
}
}
};
}

hello
10-05-2007, 13:13
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!!! ;)

PGI-Bis
10-05-2007, 13:46
Con ProcessBuilder sarebbe:

ProcessBuilder processBuilder = new ProcessBuilder("pippo", "ciccio.zzz", ">", "finito.txt");
processBuilder.start();

hello
10-05-2007, 14:39
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:

PGI-Bis
10-05-2007, 14:48
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!

hello
14-05-2007, 11:19
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:

PGI-Bis
14-05-2007, 11:51
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.

hello
14-05-2007, 12:14
ho provato con NetBeans 5.5 e funziona!!! :D

grazie!!! ;)