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

    output di un subprocesso (Molto importante)

    Ciao a tutti, ho un problema nel prelevare l'output generato da un programma esterno eseguit con il getRuntime.exec() da una funzione Java.
    Riassumo brevemente:
    codice:
       1. try {
       2.             Process startUP = Runtime.getRuntime().exec(cmdline);
       3.             InputStreamReader isr = new InputStreamReader(startUP.getInputStream());
       4.             BufferedReader br = new BufferedReader(isr);
       5.            
       6.             String linea = null;
       7.             linea=br.readLine();           
       8.             while(linea!=null) {
       9.                try {
      10.                 System.out.println(linea);
      11.                 linea=br.readLine();
      12.  
      13.                 //qui devo fare il parsing della riga
      14.            
      15.                } catch (IOException e) {
      16.                    e.printStackTrace();
      17.                }
      18.             }
      19.         } catch (IOException e)
      20.         {
      21.             System.err.println("ioexception starting process! " + e);
      22.         }
    Questo è quello che sostanzialmente contiene la funzione, il mio problema è che alla riga 13 con un semplice programma di prova il cui output è un semplice "Ciao mondo" posso processare la riga (se la visualizzo 100 volte non ci sono problemi per 100 volte ottengo la stessa riga).
    Se il programma che lancio è quello che poi mi servirà, alla riga 13 ottengo un bel null dentro alla mia "linea"
    L'output del programma che mi servirà è questo:

    (0002,0001) OB #2 [00\01] File Meta Information Version
    (0002,0002) UI #20 [1.2.840.10008.1.3.10] Media Storage SOP Class UID
    (0002,0003) UI #54 [1.2.40.0.13.1.10.8.132.161.2814081.200809081443384 13.1] Me
    (0002,0010) UI #20 [1.2.840.10008.1.2.1] Transfer Syntax UID
    ...

    E' solo una piccola parte perchè mi genera circa 1700 righe.
    Qualcuno capisce cosa sbaglio?
    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: output di un subprocesso (Molto importante)

    Originariamente inviato da GiacomoP1981
    Qualcuno capisce cosa sbaglio?
    È per come hai fatto il loop (che non è il massimo). Hai fatto 2 readLine() (perché??). Se il primo ritorna null (=fine) non entri nemmeno nel loop. Ma nel loop dopo il readLine() fai subito il parsing. Ed è lì il problema. Ad un certo punto uscirà sicuramente null (=fine) ma subito dopo fai il parsing ... non fai alcun test.

    String linea;

    while ((linea = br.readLine()) != null) { ...... }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per le precisazioni, ma non è questo il problema, provo di spiegarmi meglio.
    Il codice che ho postato (anche corretto con i tuoi suggerimenti) si comporta in modo diverso a seconda del processo che lancia:
    Se il processo ha un output del tipo:

    "This is the output of the subprocess.
    This is the output of the subprocess.
    This is the output of the subprocess."

    Non da nessun problema, riesco, ad esempio a visualizzarlo con un System.out.println(); mentre se il processo che lancio ha un output fatto diversamente:

    "(0002,0001) OB #2 [00\01] File Meta Information Version
    (0002,0002) UI #20 [1.2.840.10008.1.3.10] Media Storage SOP Class UID
    (0002,0003) UI #54 [1.2.40.0.13.1.10.8.132.161.2814081.200809081443384 13.1] Me
    (0002,0010) UI #20 [1.2.840.10008.1.2.1] Transfer Syntax UID
    ..."

    Dentro a "linea" non trovo nulla.

    Potrebbe essere colpa del BufferedReader vista la dimensione del secondo output?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Tanto per dirne una, sei sicuro che l'output di quel programma "reale" sia davvero sullo standard-output e non sullo standard-error??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Il programma non l'ho fatto io, quindi questo non lo so, adesso provo a prelevare l'ErrorStream...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da GiacomoP1981
    Il programma non l'ho fatto io, quindi questo non lo so, adesso provo a prelevare l'ErrorStream...
    Lancialo a mano da prompt: app.exe > pippo.txt. Se scrive tutto sul file è su std-out, se ti stampa tutto a video è su std-err.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Allora è stdoutput, però guardando lo stderr mi appare qualcosa di interessante, la cmdline che uso per lanciare il sottoprocesso è:

    String[] cmdline = {"/path/to/program", "-t", "/path/parametro"};

    Considera solo il primo elemento di cmdline, eppure ho visto esempi che indicavano di usare questa sintassi

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.