quarta-feira, abril 04, 2012

Comando tee em Java

No domingão passado estive brincando com shell script.

Durante muito tempo usei esse tipo de script para automatizar um monte de tarefas (backup, deploy, remoção periódica de arquivos temporários, instalação de programas, etc).

A brincadeira era melhorar o log do backup. Para isso usei o comando Tee, para gravar no arquivo todas as informações impressas na tela durante a execução do script. Quando finalizei a alteração, percebi quanto o tee foi útil e decidi escrevê-lo em Java.

Segue a implementação:

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

/**
 * Implementação do comando Tee em Java.
 * 
 * Para mais informações sobre o comando Tee
 * acesse: http://en.wikipedia.org/wiki/Tee_(command)
 * 
 * @author andersonlf
 * @version 1.0.0
 * @since 2012
 */
public class TeeCommandJava extends OutputStream {

  private OutputStream os1;
  private OutputStream os2;

  /**
   * Construtor TeeCommandJava
   * 
   * @param os1 OutputStream original.
   * @param os2 Outro OutputStream.
   * @see java.io.OutputStream
   */
  public TeeCommandJava(OutputStream os1, OutputStream os2) {
    this.os1 = os1;
    this.os2 = os2;
  }

  /**
   * (non-Javadoc)
   * @see java.io.OutputStream#write(int)
   */
  public void write(int i) throws IOException {
    os1.write(i);
    os2.write(i);
  }

  /**
   * (non-Javadoc)
   * @see java.io.OutputStream#flush()
   */
  public void flush() throws IOException {
    os1.flush();
    os2.flush();
  }

  /**
   * (non-Javadoc)
   * @see java.io.OutputStream#close()
   */
  public void close() throws IOException {
    os1.close();
    os2.close();
  }

  /**
   * Main
   * 
   * @param args Argumentos da linha de comando
   * @throws IOException Lançada em caso de erros. 
   * @see java.io.IOException
   */
  public static void main(String[] args) throws IOException {
    // imprime apenas na saída padrão
    System.out.println("início");
    // obtem o output stream original
    PrintStream originalOutputStream = System.out;
    // altera o output stream original para o TeeCommandJava
    System.setOut(new PrintStream(new TeeCommandJava(System.out, new PrintStream("test.log"))));
    // imprime na saída padrão e no arquivo de log
    System.out.println("*");
    for (int i = 1; i <= 10; i++) {
      System.out.println(i);
    }
    System.out.println("*");
    // altera o output stream para o original
    System.setOut(originalOutputStream);
    // imprime apenas na saída padrão
    System.out.println("Fim");
  }
}