Destrinchando a classe java.lang.System

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.

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

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:

Esta classe possui diversos métodos, como já falamos anteriormente, e neste artigo mostraremos a maioria deles, explicando com exemplos e conceitos.

System.in

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

import java.util.Scanner; public class AppSystem { public static void main (String ... args){ Scanner scan = new Scanner(System.in); System.out.println ("Digite: "); String entrada = scan.nextLine(); System.out.println ("Você digitou: " +entrada); } }

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”.

System.out

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

import java.math.BigDecimal; public class AppSystem { public static void main (String ... args){ boolean b = false; System.out.print("booleano:" + b); int i = -1; System.out.print("inteiro:" + i + "\n"); Double db = 10d; float ft = 20f; BigDecimal bgd = new BigDecimal(30); 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

import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; import java.math.BigDecimal; public class AppSystem { public static void main (String ... args) throws FileNotFoundException{ //Muda a saída padrão PrintStream out = new PrintStream(new FileOutputStream (new File("/tmp/teste.txt"))); System.setOut(out); boolean b = false; //imprime o valor booelano System.out.print("booleano:" + b); int i = -1; //imprime o valor do primitivo inteiro e dá um enter (\n") no final System.out.print("inteiro:" + i + "\n"); Double db = 10d; float ft = 20f; BigDecimal bgd = new BigDecimal(30); //imprime os valores Double(objeto), float(primitivo) e //BigDecimal(objeto) System.out.print("double: " + db + " float: " + ft + " BigDecimal: " + bgd); } }

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.

System.err

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

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class AppSystem { public static void main(String... args) throws FileNotFoundException { try { InputStream input = new FileInputStream("/tmp/dados.txt"); System.out.println("Aberto arquivo..."); } catch (IOException e) { System.err.println("Falha ao tentar abrir o arquivo:"); e.printStackTrace(); } } }

System.arraycopy

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

import java.io.FileNotFoundException; public class AppSystem { public static void main(String... args) throws FileNotFoundException { //Array de Origem char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' }; //Array Destino char[] copyTo = new char[7]; //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 * */ System.arraycopy(copyFrom, 2, copyTo, 0, 7); System.out.println(new String(copyTo)); } }

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)

import java.io.FileNotFoundException; public class AppSystem { public static void main(String... args) throws FileNotFoundException { //Traz o nome do usuário logado no sistema System.out.println(System.getProperty ("user.name")); } }

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()

import java.io.FileNotFoundException; public class AppSystem { public static void main(String... args) throws FileNotFoundException { //Lista todas as propriedades disponíveis no sistema System.getProperties().list(System.out); } }

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)

//termino de execução normal System.exit(0); //termino de execução Anormal System.exit(-1);

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.

Artigos relacionados