Comment pipe InputStream à ProcessBuilder

Veuillez passer à la 2ème mise à jour. Je ne voulais pas changer le contexte précédent de cette question.

Je suis en utilisant wkhtmltoimage à partir d'une application Java.

Le niveau moyen de l'aide c'est - path-to-exe http://url.com/image.png.

Selon leurs docs, si nous écrivons un - au lieu d'une URL d'entrée, l'entrée se décale vers STDIN.

Je suis de commencer le processus à l'aide de ProcessBuilder -

ProcessBuilder pb = new ProcessBuilder(exe_path, " - ", image_save_path);

Process process = pb.start();

Maintenant, je suis incapable de comprendre comment canaliser un flux d'entrée pour ce processus.

J'ai un fichier de modèle de lire dans un DataInputStream, et je suis ajoutant une chaîne à la fin:

DataInputStream dis = new DataInputStream (new FileInputStream (currentDirectory+"\\bin\\template.txt"));
byte[] datainBytes = new byte[dis.available()];
 dis.readFully(datainBytes);
 dis.close();

 String content = new String(datainBytes, 0, datainBytes.length);

 content+=" <body><div id='chartContainer'><small>Loading chart...</small></div></body></html>";

Comment puis-je pipe content à la STDIN du processus?

Mise à JOUR---

À la suite de la réponse par Andrzej Doyle:

J'ai utilisé le getOutputStream() du processus:

ProcessBuilder pb = new ProcessBuilder(full_path, " - ", image_save_path);

    pb.redirectErrorStream(true); 

    Process process = pb.start();         

    System.out.println("reading");

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

    bw.write(content);

C'est une erreur de dire:

Exception in thread "main" java.io.IOException: The pipe has been ended

2e mise à JOUR--------

L'actuel bloc de code est comme suit:

    try {
        ProcessBuilder pb = new ProcessBuilder(full_path, "--crop-w", width, "--crop-h", height, " - ", image_save_path);
        System.out.print(full_path+ "--crop-w"+ width+ "--crop-h"+ height+" "+ currentDirectory+"temp.html "+ image_save_path + " ");
        pb.redirectErrorStream(true); 

        Process process = pb.start(); 
        process.waitFor();
        OutputStream stdin = process.getOutputStream();

        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
//content is the string that I want to write to the process.

        writer.write(content);
        writer.newLine();  
        writer.flush();
        writer.close();


    } catch (Exception e) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    }

Exécute le code ci-dessus donne-moi un IOException: The pipe is being closed.

De quoi dois-je faire pour garder le tuyau ouvert?

Si vous déplacez pas le pb.démarrer à la fin du programme? (après bw.écrire(contenu); Juste une intuition basée sur "comment pouvons-nous écrire à un processus, après qu'il avait commencé!"
eh bien, je pense que nous aurions besoin de lancer un processus en vue d'obtenir son outputstream.
Vous êtes l'écriture de données sur le outputstream ceci se traduit par "votre sont l'écriture des données dans le processus!" Si vous voulez obtenir à la sortie du processus, alors vous devriez le faire le processus.getInputStream et puis de le lire
Êtes-vous de lire le flux d'erreur? Peut-être le sous-processus émet une erreur et de se terminer. Si vous n'êtes pas lire le flux d'erreur, vous ne le saurez jamais.
Je trouve getOutputStream un très non-explicite nom de l'objet : Retourne le flux de sortie connectée à l'entrée normale de la sous-processus. De sortie pour le flux est canalisé dans l'entrée standard du processus représenté par ce Processus objet. En python, il est simplement appelé stdin mais alors on pourrait dire que l'écriture de quelque chose qui s'appelle stdin n'est pas sémantiquement correct.

OriginalL'auteur Hrishikesh Choudhari | 2012-06-28