2010-05-17 11 views
37

Estoy ejecutando una aplicación desde el interior de otra con fines de prueba. Quiero redirigir el resultado de la aplicación probada a un archivo, para poder tener un registro después de cada prueba.System.out a un archivo en java

¿Hay una manera de reorientar la salida de una aplicación en un archivo desde la línea de comandos en Java?

+2

que es más probable va a ser una solución externa con respecto a la máquina virtual de Java, como descriptores de archivo de redirección en bash/sh (por ejemplo, "app.exe> ​​file.log 2> & 1"), a menos que use alguna biblioteca de registro configurable – bobah

Respuesta

64

Puede utilizar el redirector de flujo de salida que se apoya en la línea de comandos de Windows, conchas * nix, por ejemplo,

java -jar myjar.jar > output.txt 

alternativa, tal como se está ejecutando la aplicación desde el interior de la máquina virtual, puede redirigir System.out desde dentro de java en sí. Usted puede utilizar el método

System.setOut(PrintStream ps)

que sustituye a la secuencia de salida estándar, por lo que todas las llamadas posteriores a System.out van a la corriente que se especifique. Puede hacer esto antes de ejecutar su aplicación envuelta, p. llamando System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("output.txt"))));

Si está utilizando un envoltorio que no se puede modificar, a continuación, crear su propio envoltorio. Así que tienes el contenedor FEST -> contenedor de redirector de flujo -> aplicación probada.

Por ejemplo, se puede implementar un contenedor simple como esto:

public class OutputRedirector 
{ 
    /* args[0] - class to launch, args[1]/args[2] file to direct System.out/System.err to */ 
    public static void main(String[] args) throws Exception 
    { // error checking omitted for brevity 
     System.setOut(outputFile(args(1)); 
     System.setErr(outputFile(args(2)); 
     Class app = Class.forName(args[0]); 
     Method main = app.getDeclaredMethod("main", new Class[] { (new String[1]).getClass()}); 
     String[] appArgs = new String[args.length-3]; 
     System.arraycopy(args, 3, appArgs, 0, appArgs.length); 
     main.invoke(null, appArgs); 
    } 
    protected PrintStream outputFile(String name) { 
     return new PrintStream(new BufferedOutputStream(new FileOutputStream(name)), true); 
    } 
} 

se invoca con 3 params adicionales - la clase principal para ejecutar, y dirige la salida/error.

+3

Y para que quede claro, esto no tiene nada que ver con java en sí, pero es una instalación estándar ofrecida por el shell. –

+1

gracias, he actualizado mi respuesta para dejarlo en claro. – mdma

+0

Intenté hacer eso pero termino con un archivo txt vacío. El out put aún va a la terminal. El problema es que estoy usando una clase de ayuda de una biblioteca de pruebas llamada FEST (http://fest.easytesting.org). Esta clase de ayuda acepta parámetros que luego puede pasar a la aplicación. El redirector de flujo podría no encajar aquí – Omar

24

sí se puede establecer el archivo deseado como este.

try { 
    System.setOut(new PrintStream(new File("output-file.txt"))); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

-1 para el seguimiento de pila de impresión – artbristol

+0

@artbristol -1 si había un bloque vacío. –

+0

Sé que este es un hilo muy antiguo. ¿Puede alguien explicar la diferencia entre 'System.setOut (new PrintStream (new File ("output-file.txt"))); 'y' new PrintStream (new BufferedOutputStream (new FileOutputStream ("output-file.txt")), true); '? ¿Por qué elegir uno sobre el otro? si estoy preguntando algo ingenuo, sin embargo, no veo ninguna diferencia. Estoy usando JDK8 –

7

Con el fin de mejorar la respuesta "vijay.shad" He utilizado el código de abajo para dirigir el archivo en el directorio de inicio en Linux o en Windows MyDocuments.

try { 
     System.setOut(new PrintStream(new File(FileSystemView.getFileSystemView() 
       .getDefaultDirectory().toString() 
       + File.separator + "output-file.txt"))); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

-1 para la pila de impresión traza – artbristol

41

Al utilizar este constructor:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")));

recuerde configurar autoflushing a verdadero, es decir .:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")), true);

de lo contrario puede obtener archivos vacíos, incluso después de que su programa termine.

+1

Buen hombre de captura! – yhcowboy

+0

@ben [Hay un constructo r] (https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#PrintStream (java.io.OutputStream,% 20boolean)) en PrintStream que admite la descarga automática. – heenenee

+0

@heenenee Veo eso. Sin embargo, mi comentario se refería a una parte de la respuesta que se modificó después de hacer mi comentario. Ver también el historial de edición de la respuesta. – ben

3

System.out.println() se utiliza para imprimir los mensajes en la consola.

sistema es una clase definida en el paquete java.lang. out es una instancia de PrintStream, que es un miembro público y estático de la clase System. Como todas las instancias de la clase PrintStream tienen un método público println().

System.out es un PrintStream estática que escribe en la consola. Podemos redirigir la salida a un PrintStream diferente utilizando el método System.setOut() que toma un PrintStream como un parámetro.

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 

public class SetPrintStream { 
    public static void main(String[] args) throws FileNotFoundException{ 
      System.out.println("Print on console"); 

      // Store console print stream. 
      PrintStream ps_console = System.out; 

      File file = new File("file.txt"); 
      FileOutputStream fos = new FileOutputStream(file); 

      // Create new print stream for file. 
      PrintStream ps = new PrintStream(fos); 

      // Set file print stream. 
      System.setOut(ps); 
      System.out.println("Print in the file !!"); 

      // Set console print stream. 
      System.setOut(ps_console); 
      System.out.println("Console again !!"); 
} 
} 

Output: 
Print on console 
Console again !! 
new file.txt will be created. 

Para más información ver mi blog:

http://javaexplorer03.blogspot.in/2016/02/how-do-i-redirect-standard-output-to.html

1
File file = new File("xyz.txt");   
    PrintStream printStreamToFile = new PrintStream(file); 
    System.setOut(printStreamToFile); 
    System.out.println("Hello I am writing to File xyz.txt"); 
Cuestiones relacionadas