Veja neste artigo detalhes do funcionamento da classe System, retirando a idéia errônea que esta classe só serve para entrada e saída de dados.
Artigos Java Destrinchando a classe java.lang.System
Neste artigo detalharemos as funcionalidades de uma das classes mais utilizadas e mais antigas do Java, a classe java.lang.System que está presente desde o jdk1.0.
Esta classe é mais conhecida pelos seus famosos métodos de entrada e saída de dados, como é o caso do tão famoso "System.out.println()", recurso tão utilizado que o próprio Eclipse possui um atalho para sua criação, basta digitar: syso + CTRL ESPAÇO, automaticamente o Eclipse cria o comando "System.out.println()". Mas a classe System não é apenas entrada e saída de dados, vai além disto, e nosso objetivo neste artigo é mostrar, com exemplos, o máximo de funcionalidades desta classe. Nas seções abaixo mostraremos cada funcionalidade com explicações e exemplos.
A classe System não pode ser estendida pois seus métodos são estáticos, sem a necessidade de criação de uma instância em memória. Além disso, esta classe tem 3 variáveis que são:
err: Sendo este do tipo PrintStream, armazena a saída padrão para mensagens de erro do sistema.
In: Sendo este do tipo InputStream, armazena a entrada padrão do sistema, que pode ser, por exemplo, um teclado ou um arquivo de texto (mostraremos mais a frente como funciona).
out: Sendo do mesmo tipo da variável "err" (PrintStream), esta variável armazena a saída padrão de mensagens da aplicação.
Esta classe possui diversos métodos, como já falamos anteriormente, e neste artigo mostraremos a maioria deles, explicando com exemplos e conceitos.
Sendo a variável "in", uma variável que armazena a entrada padrão de dados da aplicação, conseguimos utilizar esta variável em diversas situações, vamos ver como funciona tal variável junto à classe Scanner, que nos auxilia no tratamento da entrada de dados do usuário. Observe a Listagem 1.
Listagem 1. Usando System.in junto com Scanner
public class AppSystem {
O Scanner nos ajuda a tratar a entrada de dados do usuário, mas precisamos saber qual é essa entrada, pois pode ser pelo teclado, mas também pode ser via texto, então o System.in dita ao Scanner de qual entrada ele deve procurar o que o usuário digitou.
Se digitarmos na linha de comando:
"java AppSystem".
O System.in padrão será o console, ou seja, a entrada deverá ser via teclado (digitação), porém se digitarmos no console:
"java AppSystem < entradaViaTexto.txt"
Estamos direcionando a entrada para um arquivo de texto, neste caso o System.in estará atrelado a entrada via arquivo de texto, mais especificamente o "entradaViaTexto.txt".
Diferente da variável "in", que armazena a entrada de dados padrão, a variável "out" irá armazenar a saída de dados padrão, que geralmente é o próprio console, por padrão. Vamos ao exemplo da Listagem 2.
Listagem 2. Usando o System.out.print
System.out.print("double: " + db + " float: "
+ ft + " BigDecimal: " + bgd);
Perceba que optamos por usar o "\n" para dar um enter ao final na linha, mas poderíamos optar por usar diretamente o "System.out.println" que já faz o mesmo trabalho, colocando sempre um "\n" ao final de nossa string. Na Listagem 2 todas as saídas serão no console, como abaixo:
"booleano:falseinteiro:-1
double: 10.0 float: 20.0 BigDecimal: 30"
Mas poderíamos optar por mudar a saída padrão para um arquivo texto, assim como fizemos no "System.in". Para fazer isso basta seguir a Listagem 3.
Listagem 3. Mudando a saída padrão do System.out
//Muda a saída padrão
PrintStream out = new PrintStream(new FileOutputStream
(new File("/tmp/teste.txt")));
//imprime os valores Double(objeto), float(primitivo) e
//BigDecimal(objeto)
Perceba que logo no início do nosso método main criamos uma saída em "/tmp/teste.txt" e através do "System.setOut()" dizemos qual será a nova saída do nosso programa. Agora você terá tudo em um arquivo texto e nada no console.
Este segue a mesma estrutura do "System.out", sendo que é utilizado para impressão de textos de erro, o próprio Eclipse muda a cor dos "System.err" que são impressos no console para vermelho, assim há uma diferenciação do "System.out". Poderíamos até criar um Sistema de logging próprio usando o "System.err".
Assim como nas outras variáveis: in e out. Você também pode alterar a saída padrão do err, para outra que não seja o console. Veja como na Listagem 4.
Listagem 4. Mudando a saída padrão do System.err
new FileInputStream("/tmp/dados.txt");
O método arraycopy, como o próprio nome já sugere, disponibiliza a copia de todo um array para um outro, podendo ainda selecionar índices específicos que você deseja copiar, ou seja, caso você não queira copiar todo o array (apenas o meio dele), você poderá especificar explicitamente que partes você deseja copiar. Observe a Listagem 5.
Listagem 5. Copiando arrays com System.arraycopy
//Array de Origem
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f',
'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' };
//Array Destino
//2 - indice do começo da cópia do array de origem
// para o array de destino, ou seja, vai copiar a partir
// desta posiçãocopyTo - array que irá receber a cópia
//0 - análogo ao índice do começo da cópia do
// array de origem, só que aplicado ao array de destino.
//7 - número de elementos copiados do array
//de origem. siz, lenght, tamanho...
* 1º argumento (copyFrom): Array de origem
* 2º argumento (valor 2): Posição de onde deverá começar a
* 3º argumento (copyTo): Array de Destino
* 4º argumento (valor 0): Posição de onde deve começar a
* inserção dos elementos vindos do Array de Origem no Array de Destino
* 5º argumento (valor 7): Tamanho do array de destino
O código da listagem acima está comentado, explicando o objetivo principal dele, que é a realização da cópia entre arrays.
System.getProperty(String chave) e System.getProperties()
Este método é muito útil para capturar valores de propriedades do sistema, tais como: nome do usuário logado, versão da jvm, sistema operacional e muitas outras propriedades, listaremos todas abaixo, mas antes veremos como usar tal método na Listagem 6.
Listagem 6. Usando o System.getProperty(String chave)
O exemplo da listagem acima é simples e auto-explicativo. Você apenas precisa passar o nome da propriedade e o método "getProperty()" retorna para você o valor desta propriedade. Mas como saber quais as propriedades disponibilizadas pelo sistema ? Para isso vamos usar o método getProperties() que retorna uma lista de propriedades disponíveis, como na Listagem 7.
Listagem 7. Retornando lista de propriedades com System.getProperties()
//Lista todas as propriedades disponíveis no sistema
System.exit(int valor)
Este método termina a execução atual do programa, sendo o parâmetro valor quando possui valor igual a ZERO, significa que ocorreu um término normal do programa, e qualquer valor diferente de ZERO, significa término anormal do programa. Observe a Listagem 8.
Listagem 8. Usando System.exit(int valor)
Com este artigo é possível perceber que o java.lang.System é muito mais do que uma simples classe para saída e entrada de dados, a mesma possuí outros recursos poderoso que podem ser utilizados diariamente em projetos simples ou complexos.