2010-01-05 6 views
1

Ceci est une deuxième partie à ma question here.Obtenir la sortie d'un processus

J'ai maintenant un processus mais je veux savoir comment obtenir la sortie du processus?

String filename = matlab.getfileName(); 
Process p = Runtime.getRuntime().exec("java -cp mediaProperty.java " + filename); 

Mon mediaProperty.java:

public class mediaProperty { 

    public static Object main(String[] args) { 
     Object[] mediaProp = null; 
     java.util.List lstMedia = new ArrayList(); 
     Media media = null; 

     try { 
      media = new Media(); 
      lstMedia.add(args); 
      mediaProp = media.media(3, lstMedia); 

     } catch (Exception p) { 
      System.out.println("Exception: " + p.toString()); 
     } finally { 
      MWArray.disposeArray(mediaProp); 
      if (media != null) { 
       media.dispose(); 
      } 
     } 
     return mediaProp; 
    } 
} 

Le mediaProperty.java retourne un objet. A l'intérieur, c'est en réalité un tableau de chaînes. Comment puis-je obtenir le tableau? Et la façon dont j'appelle exec() est-elle correcte?

+0

n'est-il pas public static void principal (...) au lieu d'Object? – extraneon

+0

Bien que cela n'a pas vraiment d'importance, les noms de classes commencent généralement par une capitale; mediaProperty -> MediaProperty. – extraneon

+0

Si je ne retourne pas quelque chose, comment puis-je obtenir ma sortie? –

Répondre

1

Vous pouvez faire System.setOut(new PrintStream(p.getOutputStream())) si vous souhaitez que le processus imprime ses résultats directement sur la sortie standard. Bien sûr, cela remplacera l'ancienne sortie standard. Mais vous pouvez aussi faire d'autres choses avec le flux de sortie du processus, comme si vous aviez un thread qui le lisait.

Un problème avec votre code est que la fonction principale d'une classe doit être de type void, et ne retournera rien. Vous ne pourrez pas passer d'objets Java entre les processus, car ils s'exécutent dans différentes JVM. Si vous devez le faire, vous pouvez sérialiser l'objet sur disque, mais j'imagine que vous n'avez même pas besoin de l'exécuter dans un processus séparé.

0

mediaProp est une variable locale de votre méthode main(). Ce n'est pas accessible de l'extérieur.

Vous devrez recréer un peu votre classe mediaProperty.

0

D'abord, vous devez utiliser:

"java -cp . mediaProperty " + filename 

pour appeler le processus java. Le "-cp ." définit le chemin de classe et j'ai fait l'hypothèse que le fichier java est compilé et le fichier de classe généré est au même chemin que le processus d'exécution. Ensuite, vous devez imprimer le résultat à la sortie standard et pas seulement le renvoyer. Enfin, lisez ceci article pour lire la sortie.

  • Astuce 1: Renommer la classe à MediaProperty
  • Astuce 2: Pourquoi vous n'appelez pas la classe MediaProperty directement à partir de votre code? Est-il nécessaire de lancer un nouveau processus?
+0

Oui, j'ai besoin d'un processus, longue histoire se référer ici: http: //stackoverflow.com/questions/1997585/error-when-calling-compiled-m-file-jar-in-a-multi-threaded-java- app –

0

Il y a quelques pièges. En exec, vous supposez que java est sur le chemin, et le nom de fichier doit être complet ou vous devez savoir que le répertoire de travail courant du processus java est OK. Main() doit retourner void (rien).

Si vous voulez passer les résultats de votre utilisation programme quelque chose comme:

for (Object o : mediaProp) { 
    System.out.println(o); 
} 

et l'analyser à nouveau sur le flux d'entrée (le logiciel d'appel).

Mieux encore, incluez la classe MediaProperty dans le chemin java et appelez main (...) directement au lieu d'appeler un processus Java séparé.

2
  1. utilisation public static void main (non Object comme type de retour)
  2. sérialiser l'objet en utilisant ObjectOutputStream (tous les exemples nécessaires sont dans la javadoc)
  3. La seule chose différente de l'exemple est la construction - construction comme ObjectOutputStream oos = new ObjectOutputStream (System.out);
  4. dans le programme appelant exec(), obtenir la sortie avec process.getOutputStream()
  5. Lire dans un ObjectInputStream sur la base déjà retreived OutputStream (check this)
  6. Désérialise l'objet (voir la javadoc de ObjectInputStream)

maintenant , c'est une façon étrange de le faire, mais comme je ne sais pas exactement ce que vous essayez d'atteindre, cela semble raisonnable.

+0

@Bozho: Quelle est la classe1 et la classe2 dans votre lien "Convertir un Java OutputStream en un InputStream"? –

+0

class1 est l'instance de processus. Class2 vous n'avez pas besoin - vous allez créer ObjectInputStream sur ByteArrayInputStream – Bozho

+0

Je suis désolé, je ne comprends pas. Je sais que je dois lier "out" de ObjectInputStream à process.getOutputStream. Il n'y a pas une telle méthode "putDataOnOutputStream" à droite? –

Questions connexes