2010-01-03 43 views
57

He intentado escribir la salida de la consola en un archivo txt usando esta sugerencia de código (http://www.daniweb.com/forums/thread23883.html#) sin embargo, no tuve éxito. ¿Qué pasa?Cómo escribir la salida de la consola en un archivo txt

try { 
     //create a buffered reader that connects to the console, we use it so we can read lines 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

     //read a line from the console 
     String lineFromInput = in.readLine(); 

     //create an print writer for writing to a file 
     PrintWriter out = new PrintWriter(new FileWriter("output.txt")); 

     //output to the file a line 
     out.println(lineFromInput); 

     //close the file (VERY IMPORTANT!) 
     out.close(); 
    } 
     catch(IOException e1) { 
     System.out.println("Error during reading/writing"); 
    } 
+1

El ejemplo de código que ha escrito escribe * la entrada * de la consola en un archivo. No está muy claro lo que estás tratando de lograr. ¿Puedes dar más detalles? – daphshez

+0

Tengo muchas salidas en la consola como resultado de system.out.println. Intento escribir todos estos resultados en un archivo .txt. – Jessy

Respuesta

105

Es necesario hacer algo como esto:

PrintStream out = new PrintStream(new FileOutputStream("output.txt")); 
System.setOut(out); 

La segunda afirmación es la clave. Cambia el valor del atributo supuestamente "final" System.out para que sea el valor de PrintStream suministrado.

Hay métodos análogos (setIn y setErr) para cambiar la entrada estándar y las secuencias de error; refiérase a los javadocs java.lang.System para más detalles.


Sólo me gustaría añadir que por lo general es una mejor idea de utilizar un subsistema de registro como Log4j, Logback o el subsistema estándar de Java java.util.logging. Estos ofrecen cosas como el control de registro detallado a través de archivos de configuración en tiempo de ejecución, soporte para archivos de registro continuos, avances en el registro del sistema.

O, si lo que está haciendo no es "registro", y luego considerar ya sea:

  • redirigir la salida estándar a un archivo en la línea de comandos o
  • cambiar la aplicación para utilizar un flujo de out pasó como un parámetro en lugar de escribir al System.out.

jugar un poco con (por ejemplo, reorientando) System.out es susceptible de causar sorpresas desagradables para otro código en su JVM que no espera que esto suceda.

+0

Gracias Stephen ... mi problema fue resuelto. Como lo sugirió ZoogieZork, puse este código al principio de mi programa ... ¡y FUNCIONA! Gracias a todos. – Jessy

+0

@Bozho - taa ... arreglado. –

+0

Recomendaría un enfoque más seguro, en lugar de perder el tiempo con los atributos del sistema. Podría llevar a efectos no deseados. –

4

Puede utilizar System.setOut() en el inicio de su programa para redirigir todas las salidas a través de System.out a su propio PrintStream.

9

Cree el siguiente método:..

public class Logger { 
    public static void log(String message) { 
     PrintWriter out = new PrintWriter(new FileWriter("output.txt", true), true); 
     out.write(message); 
     out.close(); 
    } 
} 

(no he incluido el IO adecuado manejo en la clase anterior, y no se compilará - hágalo usted mismo también puede ser conveniente configurar el nombre del archivo Nota el argumento de la "verdadera". Esto significa que el archivo no se vuelve a crear cada vez que se llama al método)

Entonces, en lugar de System.out.println(str) llamada Logger.log(str)

Este enfoque manual no es preferible. Utilice un marco de registro - slf4j, log4j, commons-logging, y muchos más

+0

Probablemente quiso decir 'PrintWriter out = new PrintWriter (new FileWriter (" output.txt ", true), true);', para anexar y auto-flush, en lugar de 'PrintWriter out = new PrintWriter (new FileWriter ("output.txt"), verdadero); 'que solo se vacía automáticamente. –

+0

@AhmedNassar good catch – Bozho

+0

¿No cambiará el archivo de texto cada vez que cree un nuevo printWriter? –

19

a preservar la salida de la consola, es decir, escribir en un archivo y también tienen que mostrar en la consola, se puede usar una clase como:

public class TeePrintStream extends PrintStream { 
     private final PrintStream second; 

     public TeePrintStream(OutputStream main, PrintStream second) { 
      super(main); 
      this.second = second; 
     } 

     /** 
     * Closes the main stream. 
     * The second stream is just flushed but <b>not</b> closed. 
     * @see java.io.PrintStream#close() 
     */ 
     @Override 
     public void close() { 
      // just for documentation 
      super.close(); 
     } 

     @Override 
     public void flush() { 
      super.flush(); 
      second.flush(); 
     } 

     @Override 
     public void write(byte[] buf, int off, int len) { 
      super.write(buf, off, len); 
      second.write(buf, off, len); 
     } 

     @Override 
     public void write(int b) { 
      super.write(b); 
      second.write(b); 
     } 

     @Override 
     public void write(byte[] b) throws IOException { 
      super.write(b); 
      second.write(b); 
     } 
    } 

y se utiliza como en:

FileOutputStream file = new FileOutputStream("test.txt"); 
    TeePrintStream tee = new TeePrintStream(file, System.out); 
    System.setOut(tee); 

(sólo una idea, no completar)

7

Además de los varios progra enfoques matemáticos discutidos, otra opción es redirigir salida estándar desde el shell. Aquí hay varios ejemplos de Unix y DOS.

+0

no funciona con java. – drzymala

+1

¿Qué "no funciona con Java?" – trashgod

+2

Lo siento, me perdí el ampersand en el comando. El comando en Unix es: "java -jar yourApplication.jar> & yourLogFile.txt" – drzymala

3

Esta es mi idea de lo que está tratando de hacer y funciona bien:

public static void main(String[] args) throws IOException{ 

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

    BufferedWriter out = new BufferedWriter(new FileWriter("c://output.txt")); 
    try { 
     String inputLine = null; 
     do { 
      inputLine=in.readLine(); 
      out.write(inputLine); 
      out.newLine(); 
     } while (!inputLine.equalsIgnoreCase("eof")); 
     System.out.print("Write Successful"); 
    } catch(IOException e1) { 
     System.out.println("Error during reading/writing"); 
    } finally { 
     out.close(); 
     in.close(); 
    } 
} 
25

No hay necesidad de escribir ningún código, sólo en cmd en la consola puede escribir:

javac myFile.java 
java ClassName > a.txt 

Los datos de salida se almacenan en el archivo a.txt.

+7

Esto funciona para la salida estándar. Si desea capturar también el resultado de salida de error: "java ClassName> a.txt 2> & 1". Por ejemplo, la simple "versión java" escribe en console.err, que solo puede capturar con mi extensión. – Heri

1

La forma más fácil de escribir la salida de la consola a un archivo de texto es

//create a file first  
    PrintWriter outputfile = new PrintWriter(filename); 
//replace your System.out.print("your output"); 
    outputfile.print("your output"); 
    outputfile.close(); 
+1

Por favor, no realice más ediciones como [esto] (http://stackoverflow.com/review/suggested-edits/12501763). Lo empeoró activamente, sin una razón clara. No abuse de las ediciones para ganar reputación. – Rob

1

Para escribir salida de la consola a un archivo txt

public static void main(String[] args) { 
    int i; 
    List<String> ls = new ArrayList<String>(); 
    for (i = 1; i <= 100; i++) { 
     String str = null; 
     str = +i + ":- HOW TO WRITE A CONSOLE OUTPUT IN A TEXT FILE"; 
     ls.add(str); 
    } 
    String listString = ""; 
    for (String s : ls) { 
     listString += s + "\n"; 
    } 
    FileWriter writer = null; 
    try { 
     writer = new FileWriter("final.txt"); 
     writer.write(listString); 
     writer.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Si desea generar el PDF en lugar del archivo de texto, usa la dependencia dada a continuación:

<dependency> 
     <groupId>com.itextpdf</groupId> 
     <artifactId>itextpdf</artifactId> 
     <version>5.0.6</version> 
</dependency> 

Para generar un archivo PDF, utilice este código:

public static void main(String[] args) { 
    int i; 
    List<String> ls = new ArrayList<String>(); 
    for (i = 1; i <= 100; i++) { 
     String str = null; 
     str = +i + ":- HOW TO WRITE A CONSOLE OUTPUT IN A PDF"; 
     ls.add(str); 
    } 
    String listString = ""; 

    for (String s : ls) { 
     listString += s + "\n"; 
    } 
    Document document = new Document(); 
    try { 
     PdfWriter writer1 = PdfWriter 
       .getInstance(
         document, 
         new FileOutputStream(
           "final_pdf.pdf")); 
     document.open(); 
     document.add(new Paragraph(listString)); 
     document.close(); 
     writer1.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (DocumentException e) { 
     e.printStackTrace(); 
    } 
} 
+0

No creo que los lectores necesiten todo ese código para configurar una lista de cadenas para escribir; ellos podrían hacer eso ellos mismos. Esta respuesta se reduce a "después de escribir algo en System.out, también lo escribe en un archivo con un FileWriter o un PdfWriter". – Noumenon

+0

@Noumenon; Señor, es posible que tengas muchos conocimientos de Java, pero en este foro abierto hay muchos más nuevos y más nuevos y una pieza completa de código es de gran ayuda para ellos. –

+0

Gracias por la respuesta madura. Tiene razón en que es útil tener algo que pueda ejecutar y probar; también proporciono ejemplos de trabajo. Simplemente no quiero tener que leer todo el ejemplo para encontrar la respuesta. Esta misma respuesta se mejoraría si estuviera precedida por un resumen: "Simplemente escríbalo en un archivo con un FileWriter. Ejemplo de trabajo:" Como nota al margen, Stack Overflow es diferente de un foro abierto en que las respuestas están destinadas a ayudar a muchos futuros lectores además del póster original. Es más probable que prueben y voten un enfoque que sea fácil de entender de un vistazo. – Noumenon

0
PrintWriter out = null; 
try { 
    out = new PrintWriter(new FileWriter("C:\\testing.txt")); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
out.println("output"); 
out.close(); 

estoy usando ruta absoluta para el FileWriter. Me está funcionando como un encanto. También asegúrese de que el archivo esté presente en la ubicación. De lo contrario, lanzará una excepción FileNotFoundException. Este método no crea un nuevo archivo en la ubicación de destino si el archivo no se encuentra.

+0

¿Qué cambió en el código y por qué lo solucionó? – JJJ

+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – DimaSan

+0

DimaSan Gracias por señalar. Estás en lo correcto. –

0

En netbeans, puede hacer clic con el botón derecho del mouse y luego guardarlo como un archivo .txt. Luego, en función del archivo .txt creado, puede convertir al archivo en cualquier formato que desee obtener.

Cuestiones relacionadas