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 )

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top