J'utilise WKHTMLOIMAGE à partir d'une application Java. P> La manière standard d'utilisation de celui-ci est - selon leurs documents, si nous écrivions un Je démarre le processus en utilisant maintenant je ne peux pas Déterminez comment tuyer un flux d'entrée à ce processus. P> J'ai un fichier de modèle lu dans un chemin -à-EXE http://url.com/ image.png code>. p>
- code> au lieu d'une URL d'entrée, L'entrée passe à stdin. p>
ProcessBuilder code> - p>
DataGuTream code>, et je suis ajouté à une chaîne à la fin: p >
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();
}
5 Réponses :
Après avoir créé le processus code> objet code>, vous pouvez appeler getOutputStream () code>
afin de saisir un flux qui envoie son contenu à l'entrée standard du processus. P>
Une fois que vous en avez eu de cela, vous pouvez utiliser la norme IO de Java pour écrire quels octets sur ce flux que vous souhaitez (y compris l'enveloppant dans un écrivain, ajout de tampon, etc.) - et comme vous les écrivez, ils seront lire par le processus dès qu'ils sont rougrés. p>
J'utilise le getOutputStream code> et écrivez au processus à partir d'un tampon. Suis-je le faire correctement? J'ai mis à jour la question.
Y a-t-il une raison pour laquelle vous utilisez DataGuTstream pour lire un fichier texte simple? De la documentation Java
Un flux d'entrée de données permet une application lire des types de données Java primitif d'un flux d'entrée sous-jacent d'une manière indépendante de la machine p> blockQquote>
Il est possible que la façon dont vous lisez le fichier provoque l'envoi d'un EOF à la sortie à la sortie, ce qui puisse se terminer avant de ne pas atteindre votre chaîne. P>
Vous avez besoin d'être Pour lire le fichier simplement pour l'ajouter avant de le transmettre au processus WKHTMLOIMAGE. P>
Vous manquez également une déclaration pour fermer la sortie du processus. Cela entraînera une attente du processus (suspendre) jusqu'à ce qu'il obtienne une EOF du flux d'entrée, ce qui ne serait jamais. P>
Je recommanderais à la place d'un bufferedreader et de l'écrire directement sur la sortie à la sortie votre chaîne supplémentaire. Appelez ensuite fermer () pour fermer le flux. P>
ProcessBuilder pb = new ProcessBuilder(full_path, " - ", image_save_path); pb.redirectErrorStream(true); Process process = null; try { process = pb.start(); } catch (IOException e) { System.out.println("Couldn't start the process."); e.printStackTrace(); } System.out.println("reading"); try { if (process != null) { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); BufferedReader inputFile = new BufferedReader(new InputStreamReader(new FileInputStream(currentDirectory+"\\bin\\template.txt"))); String currInputLine = null; while((currInputLine = inputFile.readLine()) != null) { bw.write(currInputLine); bw.newLine(); } bw.write("<body><div id='chartContainer'><small>Loading chart...</small></div></body></html>"); bw.newLine(); bw.close(); } } catch (IOException e) { System.out.println("Either couldn't read from the template file or couldn't write to the OutputStream."); e.printStackTrace(); } BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); String currLine = null; try { while((currLine = br.readLine()) != null) { System.out.println(currLine); } } catch (IOException e) { System.out.println("Couldn't read the output."); e.printStackTrace(); }
exception dans le fil "Main" Java.IO.IOException: le tuyau a été terminé p> blockQuote>
Cela signifie que le processus que vous avez commencé est mort. Je vous suggère de lire la sortie pour voir pourquoi. par exemple. Cela vous a-t-il donné une erreur? P>
Le flux d'erreur du processus a déclaré la même chose - "Le tuyau est terminé".
Je n'ai jamais vu de programme qui donne une telle erreur lorsqu'il est exécuté à partir de la ligne de commande.
J'ai trouvé cette sortie à partir de l'erreur: java.io.bufferedreader@2512b853 code>
Cela signifie que vous imprimez l'objet bufferedreader au lieu de la lire avec readline () code> et l'impression de cela.
Le code suivant fonctionne également:
#include <iostream> #include <fstream> #include <cstdio> using namespace std; int main() { string strOutput; string str; while(getline(cin, str)) { cout << str << endl; } }
Supprimer le blanchiment de (en regardant en fait la production du processus comme suggéré par Peter vous l'aurait probablement dit ...) P> "-" code> - Les espaces blancs normaux sont supprimés par l'analyseur de coque, mais ici dans le
ProcessBuilder code>, il est interprété comme le nom de fichier (littéral) Début et se terminant par unespace Whit. P>
Si vous ne déplacez pas PB.Start à la fin du programme? (après bw.write (contenu); juste un hunch basé sur "Comment écrivez-vous à un processus après avoir commencé!"
@Grrrrr Eh bien, je pense que nous devrions commencer un processus afin d'obtenir sa production.
Vous écrivez des données sur la sortie qui se traduit par «vos données d'écriture au processus!» Si vous souhaitez obtenir la sortie du processus, vous devez faire processus.getInputStream, puis la lire
Lisez-vous le flux d'erreur? Peut-être que le sous-processus émet une erreur et se terminant. Si vous ne lisez pas le flux d'erreur, vous ne saurez jamais.
Je trouve
getOutputtream code> un nom très non explicatif pour l'objectif réel: retourne le flux de sortie connecté à l'entrée normale de la sous-processus. La sortie du flux est canalisée dans l'entrée standard du processus représenté par cet objet de processus. I> en python c'est simplement appelé
stdin code> mais on pourrait alors faire valoir que l'écriture appelle à quelque chose d'appelé
stdin code> n'est pas sémantiquement correct.