¿Cómo puedo coger un lugar java.io.PrintStream su producción en un JEditorPane?
-
27-09-2019 - |
Pregunta
Estoy intentando hacer un programa Java en el que un usuario puede seleccionar cualquier archivo o .class
.jar
desde su ordenador. Mi programa entonces aparecerá una JInternalFrame
con un JEditorPane
en ella como la consola, la captura de cualquier salida de la consola del programa del usuario. Tenga en cuenta que yo no quiero capturar sólo System.err o System.out llamadas, pero llama a todos los PrintStream que van a la consola.
(pregunta individual de IDE-estilo de programa que se ejecuta )
Solución
Usted puede coger todo lo que se imprime a través System.out
usando System.setOut
como esto:
import java.io.*;
class SystemOutLogging {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
final PrintStream original = System.out;
System.setOut(new PrintStream("programlog.txt") {
public void println(String str) {
process(str + "\n");
}
public void print(String str) {
process(str);
}
private void process(String str) {
// Fill some JEditorPane
original.println("Program printed: \"" + str + "\"");
}
});
System.out.print("Hello ");
System.out.println(" World");
}
}
Las impresiones:
Program printed: "Hello "
Program printed: " World
"
(Hay un System.setErr
y System.setIn
que funciona de manera similar.)
Si quieres cosas captura que las impresiones de "subprograma" a través de System.out.println
que están en problemas, ya que es un System.out
estática por lo que si se lanza múltiples "subprogramas" que va a terminar con un lío (ya que no puede entregar una clase System
separado para cada subprograma).
En una situación como esta, sinceramente, creo que sería una mejor idea para poner en marcha un proceso separado a través ProcessBuilder. Las corrientes de entrada / salida estándar del proceso resultante podría ser fácilmente registran.
(p.s. Cuando pienso en ello, que probablemente se podría comprobar el grupo de hilos actual en la aplicación println
, y desde que decidir qué subprograma que realmente invoca el método println
)
Otros consejos
Si vas a empezar archivo .jar del usuario mediante Runtime.exec (), obtendrá un objeto de proceso. Objeto que le permitirá el acceso a los procesos iniciados System.out, System.in y System.err arroyos.
Ver: http: // download. oracle.com/javase/1.4.2/docs/api/java/lang/Process.html
Puede tomar lectura de la err y fuera arroyos, y adicional a su JEditorPane utilizando los métodos habituales de tipo setText.