Java classe System é mto mais que só System.out.prinln

A classe System(pacote java.lang) é uma das classe mais populares(existe deste a versão jdk1.0) do Java em particular os métodos de saída(out): print, println, e de entrada(in): System.in. Tal popularidade deve-se justamente ao fato das facilidades de entrada e saída de dados, mas a classe System não é só isto. Ela prove outros recursos úteis para os desenvolvedores (saída de erro, leitura de variáveis de ambiente, e otras cositas más). Fuçando na API da classe http://docs.oracle.com/javase/7/docs/api/java/lang/System.html dá pra ver que ela tem muitas coisas legais, então decidi montar uma relação com alguns exemplos pra ilustrar o uso. Se alguém tiver mais algo a acrescentar, sinta-se a vontade  🙂

System.in:  entrada padrão input stream  – utiliza a classe InputStream do pacote java.io.

Scanner scan = new Scanner(System.in);
System.out.println ("Digite: ");
String entrada = scan.nextLine();
System.out.println ("Você digitou: " +entrada);

Na primeira linha o objeto System.in provê recurso para leitura do “input stream” dos dados digitados (teclado) pelo usuário, segundo a API é possível inputar dados por outros sources. A classe Scanner auxilia no tratamento deste input stream tornando a maninpulação mais intuitiva ao desenvolvedor. Tem um post bem bacana a repeito da classe Scanner, escrito por Marcio Ballem e pode ser conferido no endereço: http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a-classe-scanner/

System.out:   saída padrão output stream – utiliza a classe PrintStream do pacote java.io.

System.out.print():

Imprime na console Java o valor de entrada.

Suporta vários tipos na assinatura do seu método, veja a lista completa http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println()

Obs. O suporte é o mesmo que da lista de tipos do println. Imagino que os caras na api reaproveitaram o print e adicionaram o “\n” no final pra ser tão igual rs.

Exemplo:

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

Veja a saída dos três prints ( os dois primeiros numa linha só), a instrução \n dá enter na linha.

booleano:falseinteiro:-1
double: 10.0 float: 20.0 BigDecimal: 30

System.out.println():

Imprime na console java o valor de entrada e dá um ENTER no final da linha.

Este é o clássico que até no Eclipse, se vc digitar “syso” + cltrl espaço ele escreve System.out.println() automáticamente.

Suporta vários tipos na assinatura do seu método, veja a lista completa http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println()

Exemplos:

boolean b = false;

//imprime o valor booelano e dá um enter no final
System.out.println("booleano:" + b);

int i = -1;

//imprime o valor do primitivo inteiro e dá um enter no final
System.out.println("inteiro:" + i);

Double db = 10d;
float ft = 20f;
BigDecimal bgd = new BigDecimal(30);

//imprime os valores Double(objeto), float(primitivo) e BigDecimal(objeto) e dá um enter no final
System.out.println("double: " + db + " float: " + ft + " BigDecimal: " + bgd);

saída:

booleano:false
inteiro:-1
double: 10.0 float: 20.0 BigDecimal: 30

System.out.printf:

Imprime na console Java o valor de entrada formatado de acordo com parâmetro especificado.
Exemplo:

char three[] = { 't', 'h', 'r', 'e', 'e' };
System.out.printf("%b %n %c %n %s %n %s %n %d %n" 
+ "%d %n %g %n %g %n %s %n", 
!false, '3'
, new String(three)
, "Three"
,3
, Long.MAX_VALUE
, Math.PI, Double.MAX_VALUE
, new Object());

retirado de: http://www.java2s.com/Code/Java/Development-Class/Systemoutprintfbncnsnsndn.htm

saída:


true

3

three

Three

3

9223372036854775807

3.14159

1.79769e+308

java.lang.Object@61de33

Além do exemplo vale comentar que a formatação fica a gosto do freguês, veja:

String a = "string";
double dbb = 4445.67555;
int c = 60;

System.out.println();
System.out.printf("%s - %.2f - %.4f - %0,20.3f - %d\n",  a, dbb,  dbb, dbb,c);

saída:

string - 4445,68 - 4445,6756 - 000000000004.445,676 - 60

Note que:
%.2f imprime duas casas após o ponto
%.4f imprime quatro casas após o ponto
%0,20.3f imprime zeros a esquerda até atingir 20 caracteres, leva em consideração ponto e virgulas tbem.
Existe outros formatos “%”, veja uma lista com mais exemplos no link: http://jexp.ru/index.php/Java_by_API/java.lang/System.out.printf

System.err:  saída padrão de erro output stream – utiliza a classe PrintStream do pacote java.io

É similar ao funcionamento de System.out porém é normalmente utilizado para imprimir texto de erro.

Por exemplo, se vc quiser fazer o seu próprio logador de error (tipo looggind da vida) num arquivo .txt, poderia fazer algo do tipo:

File erros = new File("log_de_erros.txt");
FileOutputStrem fout = new FileOutputStream(erros);
System.setErr(fout);

Daí todos os erros enviados a System.err serão registrados no seu arquivo “log_de_erros.txt”

Outro exemplo para demonstrar à diferença:

try {
   InputStream input = new FileInputStream("c:\\aplicacao\\dados.txt");
    System.out.println("Aberto arquivo...");
} catch (IOException e){//ops... deu BO
   System.err.println("Falha ao tentar abrir o arquivo:");
   e.printStackTrace();
}

Tem IDE a exemplo do Eclipse que printa em vermelho mensagens de erro.

Não é só isto meu povo, tem mais métodos bacanas.

System.arraycopy:

Copia um array

char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' };
char[] copyTo = new char[7];

//copyFrom - array de origem
//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ção
//copyTo - 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...
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(new String(copyTo));

System.getProperty(String chave) e getProperties():

Possibilitar pegar as propriedades do sistema. A listar completa pode ser conferida no link http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getProperties()

Exemplos:

Trazer o usuário logado. Passa a chave “user.name” veja relação de outras chaves no link da lista completa, ok?

//Traz o nome do usuário logado no sistema
System.out.println(System.getProperty ("user.name"));

saída:

ricardo.spinoza

O método getProperties() traz uma relação com todas as propriedades do sistema corrente, veja exemplo:

System.getProperties().list(System.out);

saída:

-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jre7\bin
java.vm.version=21.1-b02
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=BR
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=Service Pack 1
java.vm.specification.name=Java Virtual Machine Specification
user.dir=C:\workspace\oca
java.runtime.version=1.7.0_01-b08
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jre7\lib\endorsed
os.arch=amd64
java.io.tmpdir=C:\Users\RICARD~1.PER\AppData\Local\T...
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 7
sun.jnu.encoding=Cp1252
java.library.path=C:\Program Files\Java\jre7\bin;C:\Win...
java.specification.name=Java Platform API Specification
java.class.version=51.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.1
user.home=C:\Users\ricardo.spinoza
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=Cp1252
java.specification.version=1.7
user.name=ricardo.spinoza
java.class.path=C:\workspace\oca\bin
java.vm.specification.version=1.7
sun.arch.data.model=64
java.home=C:\Program Files\Java\jre7
sun.java.command=Teste
java.specification.vendor=Oracle Corporation
user.language=pt
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.7.0_01
java.ext.dirs=C:\Program Files\Java\jre7\lib\ext;C:...
sun.boot.class.path=C:\Program Files\Java\jre7\lib\resour...
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64

System.getenv(String name) e System.getenv():

Retorna o valor de uma variavel de ambiente. Se houver esquema de segurança o metodo checkPermission é acionado pra validar permissão de acesso.
 
Exemplo:

String javaHome = System.getenv("JAVA_HOME");

//no windows similar ao comando echo %JAVA_HOME%
System.out.println("JAVA_HOME: "  + javaHome);

//no windows similar ao comando echo %USERNAME%

String userWindows = System.getenv("USERNAME");
System.out.println("USERNAME: "  + userWindows);

Há também o método Map<String,String> getenv() retorna um Map com todas as variávies de ambiente, veja exemplo:

Map<String, String> env = System.getenv();
for (String nomeVariavel : env.keySet()) {
  System.out.format("%s=%s\n", nomeVariavel, env.get(nomeVariavel));
}

System.exit(int valor):

Termina a execução corrente do programa. Por convenção valor diferente de ZERO é considerado termino anormal do programa.

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

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

Outro exemplo que achei no stackoverflow http://stackoverflow.com/questions/6937660/difference-between-system-exit0-and-system-exit-1

public class Test {
  public static void main(String[] args) throws Exception {
    System.exit(args.length);
  }
}

Na linha de comando a execução do programa Java Test no primeiro caso length é zero “exit(0)“, pois não tem parametro, o programa termina com êxito e exibe a mensagem de sucesso, já no segundo caso é informado um parametro e valor de lenght passa a valer 1 “exit(1)” e o programa termina em estado anormal, note que a mensagem de sucesso não é exibida conforme visto logo abaixo.

~ $ java Test && echo Success!
Success!//retorno na console por causa do System.exit(0)

~ $ java Test boom && echo Success!
//SEM retorno na console por causa do System.exit(1)
//qqr coisa diferente se zero é terminação anormal

Finalizando, tentei expor neste post a importância desta API e o quanto é bem útil na vida do desenvolvedor. Espero que tenha sido útil pra alguém 🙂

Flw

Deixe um comentário

Arquivado em Java, Utilidades

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s