Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    lanciare comando dos da classe Java e catturare l'output

    Ciao a tutti, sto combattendo da ieri con una situazione molto semplice ma che mi sta dando problemi... dunque, ho bisogno che da una classe java mi venga aperta una finestra di comando e mi venga eseguito un programmino esterno, nel mio caso dlv.
    A dlv devo passare un file che verrà eseguito e per cui io voglio registrare l'output su un file.
    Mettendo momentaneamente da parte la classe Java, se io apro la shell, vado in c, ed eseguo il seguente comando:
    codice:
    dlv.exe prova.txt
    il risultato è questo:
    codice:
    {q1("Miller",38000,"New York"), q1("Koch",2000000,"Atlanta"), q1("Nguyen",35000,
    "New York"), q1("Gruber",32000,"Atlanta"), q1b("Miller",38000,"New York"), q1b("
    Koch",2000000,"Atlanta"), q1b("Nguyen",35000,"New York"), q1b("Gruber",32000,"At
    lanta")}
    ora vi mostro il codice che ho scritto in java per lanciare la shell e lo stesso comando scritto sopra:

    codice:
    String command = "cmd /c start dlv.exe -nofacts prova.txt ";
    Runtime run= Runtime.getRuntime();
    		
    		File fpath;
    		try {
    			fpath = new File( "C:");
    			
    			Process processo = run.exec(command , null, fpath);
    			String line = "";
    
    			BufferedReader input = new BufferedReader(new InputStreamReader(processo.getInputStream()));
    
    			while ((line = input.readLine()) != null) {
    				
    				System.out.println(line);
    				
    			
                }
    
    		} catch (IOException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}

    in questo modo io mi aspetto che mi venga eseguito il tutto e mi venga stampato il risultato (linea dopo linea) sulla console. in realtà il mio obiettivo è di memorizzarlo su un file a parte, ma non riuscendoci sto facendo le cose passo dopo passo perchè sembra che non riesca proprio a catturare il risultato... dove sbaglio??
    PS. dimenticavo di dirvi che quando lancio la classe java, la shell viene aperta ma si richiude in un secondo automaticamente.
    Grazie a tutti !

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    No... quello che stai facendo tu è lanciare una shell che esegue qualcos'altro... quindi, l'unico input che potrai avere è un eventuale output della shell... che non ne ha.

    Perchè non esegui direttamente il programma?

    codice:
    String command = "dlv.exe -nofacts prova.txt ";
    Tutt'al più dovrai lanciare il programma inserendo il path completo dell'eseguibile. Supponendo che il programma "dlv.exe" si trovi in "C:\Programmi\DLV\dlv.exe", questa è la sintassi da usare:

    codice:
    String command = "C:\\Programmi\\DLV\\dlv.exe -nofacts prova.txt";
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ciao, grazie per aver risposto! allora.. ho modificato la stringa command secondo il tuo consiglio, e ora stampa qualcosa ovvero:


    DLV [build BEN/Oct 11 2007 gcc 3.4.5 (mingw special)]

    {}



    che comunque non è corretto in quanto mi dovrebbe stampare tutte quelle cose che ho messo nel post precedente...
    forse il problema ora è gestire proprio la stampa?? perchè è tra le parentesi graffe che è il mio risultato....

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Bisogna capire se ciò che ottieni significa che qualcosa è andato storto nel passaggio dei parametri al programma dlv.exe (tipo, non trova il file "prova.txt"?) o se l'output che viene visualizzato tra le graffe proviene dall'elaborazione di un altro processo.

    Se ricadiamo nel primo caso, sarà sufficiente aggiustare la stringa del comando in modo da passare l'intero percorso del file "txt" in modo che dlv.exe riesca a leggerlo.

    Se ricadiamo nel secondo caso, abbiamo ben poco da poter fare... essendo fuori dal controllo della JVM.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    mmmmmm
    prova.txt l'ho messo apposta in c per non fare troppi giri di path
    e poi, ti ripeto, se lancio lo stesso identico comando direttamente dalla shell non mi da alcun errore... solo non capisco cosa intendi che l'output proviene dall'elaborazione di un altro processo... è dlv che elabora "prova.txt" e restituisce il risultato..

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da RosAmantea
    mmmmmm
    prova.txt l'ho messo apposta in c per non fare troppi giri di path
    e poi, ti ripeto, se lancio lo stesso identico comando direttamente dalla shell non mi da alcun errore...
    Questo non significa nulla. Quando apri la shell ed esegui, hai una determinata "directory corrente" che è esattamente il punto in cui tu ti trovi quando esegui il comando. Se sei nella stessa directory del file "prova.txt" tutto funziona correttamente perchè il programma cercherà il file nella directory corrente.

    Ma se il programma viene eseguito da un programma Java, qual è la directory corrente? Non lo si può sapere a priori... generalmente è la "home directory" dell'utente (quindi non è di sicuro "C:\").

    Tu hai messo il file txt in C:\ per evitare tanti giri di path e hai fatto, direi, benissimo... solo che il percorso glielo dovresti comunque passare in modo assoluto. Quindi, per prima cosa, effettua un test con questa stringa per il comando:

    codice:
    String command = "C:\\Programmi\\DLV\\dlv.exe -nofacts C:\\prova.txt";
    E vediamo se funziona.

    solo non capisco cosa intendi che l'output proviene dall'elaborazione di un altro processo... è dlv che elabora "prova.txt" e restituisce il risultato..
    Io non conosco il programma "dlv.exe", quindi non so cosa faccia esattamente. Potrebbe, per assurdo, prendere il tuo file .exe e darlo in pasto ad un altro processo (esattamente come tu stai facendo in Java con lui...). Se così fosse, il nuovo processo sarebbe al di fuori del controllo della JVM, ma dubito che si tratti di questo... era solo un'ipotesi pessimistica.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    ehiiiiiiiiiiii funziona!!!
    ho cambiato la stringa come mi hai detto tu!!!! grazieeeeeeeee

    se adesso io volessi memorizzare questo risultato in un nuovo file come devo fare? mi spiego... questo è il mio codice:

    codice:
    File outputFile = new File("src\\FILE_OUTPUT\\risultato.out");
    		FileOutputStream fileOut;
    		try {
    			fileOut = new FileOutputStream(outputFile);
    			OutputStreamWriter scrivoOutFile = new OutputStreamWriter(fileOut);
    
    			Runtime run= Runtime.getRuntime();
    			File fpath;
    			fpath = new File( "C:");
    			
    			try {
    				
    				Process processo = run.exec(command);
    				String line = "";
    				
    				BufferedReader input = new BufferedReader(new InputStreamReader(processo.getInputStream()));
    	            
    				OutputStream outS=processo.getOutputStream();
    				OutputStreamWriter outSW = new OutputStreamWriter(outS);
    				
    				while ((line = input.readLine()) != null) {
    							
    					
    	            	scrivoOutFile.append(line+"\n");
    	            	scrivoOutFile.flush();
    	            	if(line.equals("")){
    	            		outSW.write("n \n");
    	        			outSW.flush();
    	        			
    	        			outSW.write("n \n");
    	        			outSW.flush();
    	            	}
    	            }
    	            
    				input.close();
    				outS.close();
    				scrivoOutFile.close();
    				
    				processo.destroy();
    
    				run.gc();
    				
    				
    				
    				
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    
    
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    leggiFile();
    dove leggiFile mi stampa il risultato che è nel file, e lo fa correttamente. se però io provo ad aprire il file stesso, che si trova in src/OUTPUT/risultato.out del mio progetto Eclipse, il file è vuoto.. come è possibile?? se fosse vuoto non mi stamperebbe nulla...

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Mi sembra corretto.
    Attenzione sempre a questo:

    codice:
    File outputFile = new File("src\\FILE_OUTPUT\\risultato.out");
    Crei un file chiamato "risultato.out" all'interno di una directory chiamata "FILE_OUTPUT" che sta all'interno di una directory "src" che deve esistere all'interno della directory corrente... quale che sia la directory corrente è sempre un punto interrogativo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    ok grazie mille! allora indagherò e spero di risolvere! grazie ancora

  10. #10

    confused

    Ciao! ho provato ad effettuare tante prove... ma nulla! la stampa avviene correttamente, ma se apro il file è vuoto...! non capisco come sia possibile.... nel metodo "leggiFile" prendo il file in cui c'è il risultato della shell e stampo il tutto.. se fosse vuoto questo non sarebbe possibile.... chi mi illumina??il codice del metodo è il seguente:

    codice:
    public void leggiFileOutput()
    	{
    
    		System.out.println("sto leggendo il file...");
    
    		File risultato = new File(".\\src\\FILE_OUTPUT\\risultato.out");
    
    		try {
    			FileInputStream file = new FileInputStream(risultato);
    			InputStreamReader input = new InputStreamReader(file);
    			BufferedReader reader = new BufferedReader(input);
    
    			String linea = reader.readLine();
    
    			FileOutputStream fos = new FileOutputStream(risultato);
    			PrintStream print = new PrintStream(fos);
    
    			while((linea = reader.readLine()) != null )
    			{
    				System.out.println(linea);
    								
    				print.println();
    				print.println();
    
    			}
    
    			file.close();
    			input.close();
    			print.flush();
    			print.close();
    			reader.close();
    
    
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    
    
    	}

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.