Guia rápido para java.lang.System
1. Visão geral
Neste tutorial, daremos uma olhada rápida na classejava.lang.System e seus recursos e funcionalidades principais.
2. IO
System faz parte dejava.lang e um de seus principais recursos é nos dar acesso aos fluxos de E / S padrão.
Simplificando, expõe três campos, um para cada fluxo:
-
out
-
err
-
in
2.1. System.out
System.out aponta para o fluxo de saída padrão, expondo-o comoPrintStream, e podemos usá-lo para imprimir texto no console:
System.out.print("some inline message");
Um uso avançado deSystem é chamarSystem.setOut, que podemos usar para personalizar o local ondeSystem.out escreverá:
// Redirect to a text file
System.setOut(new PrintStream("filename.txt"));
2.2. System.err
System.err é muito parecido comSystem.out. Ambos os campos são instâncias dePrintStream, e ambos são para imprimir mensagens no console.
MasSystem.err representa o erro padrão e usamos isso especificamente para enviar mensagens de erro:
System.err.print("some inline error message");
Os consoles geralmente renderizam o fluxo de erro de maneira diferente do fluxo de saída.
Para mais informações, verifique a documentaçãoPrintStream.
2.3. System.in
System.in aponta para o padrão em, expondo-o como umInputStream, e podemos usá-lo para ler a entrada do console.
E, embora um pouco mais envolvido, ainda podemos gerenciar:
public String readUsername(int length) throws IOException {
byte[] name = new byte[length];
System.in.read(name, 0, length); // by default, from the console
return new String(name);
}
Ao chamarSystem.in.read, o aplicativo para e espera a entrada do padrão em. Quaisquer que sejam os próximoslength bytes, eles serão lidos do fluxo e armazenados na matriz de bytes.
Anything else typed by the user stays in the stream, esperando outra chamada pararead.
Claro, operar nesse nível baixo pode ser desafiador e sujeito a erros, então podemos limpar um pouco comBufferedReader:
public String readUsername() throws IOException {
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
return reader.readLine();
}
Com o arranjo acima,readLine lerá deSystem.in até que o usuário retorne, o que é um pouco mais próximo do que poderíamos esperar.
Observe que, propositalmente, não fechamos o stream neste caso. Closing the standard inmeans that it cannot be read again for the lifecycle of the program!
E, finalmente, um uso avançado deSystem.in é chamarSystem.setIn para redirecioná-lo para umInputStream diferente.
3. Métodos Utilitários
System nos fornece vários métodos para nos ajudar com coisas como:
-
Acessando o console
-
Copiando matrizes
-
Observando data e hora
-
Saindo do JRE
-
Acessando propriedades de tempo de execução
-
Acessando variáveis de ambiente e
-
Administrando a Coleta de Lixo
3.1. Acessando o console
Java 1.6 introduziu outra maneira de interagir com o console do que simplesmente usarSystem.outein diretamente.
Podemos acessá-lo chamandoSystem.console:
public String readUsername() {
Console console = System.console();
return console == null ? null :
console.readLine("%s", "Enter your name: ");
}
Observe que, dependendo do sistema operacional subjacente e de como iniciamos o Java para executar o programa atual,console might return null, so always make sure to check before using.
Verifique a documentaçãoConsole para mais usos.
3.2. Copiando matrizes
System.arraycopy é uma maneira antiga no estilo C de copiar um array para outro.
Principalmente,arraycopy destina-se a copiar uma matriz completa em outra matriz:
int[] a = {34, 22, 44, 2, 55, 3};
int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);
assertArrayEquals(a, b);
No entanto, podemos especificar a posição inicial para ambas as matrizes, bem como quantos elementos copiar.
Por exemplo, digamos que queremos copiar 2 elementos dea, começando ema[1] parab, começando emb[3]:
System.arraycopy(a, 1, b, 3, 2);
assertArrayEquals(new int[] {0, 0, 0, 22, 44, 0}, b);
Além disso, lembre-se de quearraycopy lançará:
-
NullPointerException se qualquer matriz fornull
-
IndexOutOfBoundsException se a cópia fizer referência a qualquer matriz além de seu intervalo
-
ArrayStoreException se a cópia resultar em uma incompatibilidade de tipo
3.3. Data e hora de observação
Existem dois métodos relacionados ao tempo emSystem. Um écurrentTimeMillise o outro énanoTime.
currentTimeMillis retorna o número de milissegundos passados desde a época do Unix, que é 1º de janeiro de 1970, às 12h UTC:
public long nowPlusOneHour() {
return System.currentTimeMillis() + 3600 * 1000L;
}
public String nowPrettyPrinted() {
return new Date(System.currentTimeMillis()).toString();
}
nanoTime retorna o tempo relativo à inicialização da JVM. Podemos chamá-lo várias vezes para marcar a passagem do tempo no aplicativo:
long startTime = System.nanoTime();
// ...
long endTime = System.nanoTime();
assertTrue(endTime - startTime < 10000);
Observe que, comonanoTime é tão refinado,it’s safer to do endTime – startTime < 10000 than endTime < startTime due to the possibility of numerical overflow.
3.4. Saindo do programa
Se quisermos sair programaticamente do programa executado atualmente,System.exit resolverá o problema.
Para invocarexit, precisamos especificar um código de saída, que será enviado ao console ou shell que lançou o programa.
Por convenção no Unix, um status 0 significa uma saída normal, enquanto diferente de zero significa que ocorreu algum erro:
if (error) {
System.exit(1);
} else {
System.exit(0);
}
Observe que para a maioria dos programas hoje em dia, seria estranho precisar chamar isso. When called in a web server application, for example, it may take down the entire site!
3.5. Acessando propriedades de tempo de execução
System fornece acesso às propriedades de tempo de execução comgetProperty.
E podemos gerenciá-los comsetProperty eclearProperty:
public String getJavaVMVendor() {
System.getProperty("java.vm.vendor");
}
System.setProperty("abckey", "abcvaluefoo");
assertEquals("abcvaluefoo", System.getProperty("abckey"));
System.clearProperty("abckey");
assertNull(System.getProperty("abckey"));
As propriedades especificadas por meio de-D são acessíveis por meio degetProperty.
Também podemos fornecer um padrão:
System.clearProperty("dbHost");
String myKey = System.getProperty("dbHost", "db.host.com");
assertEquals("db.host.com", myKey);
ESystem.getProperties fornece uma coleção de todas as propriedades do sistema:
Properties properties = System.getProperties();
A partir do qual podemos fazer quaisquer operaçõesProperties:
public void clearAllProperties() {
System.getProperties().clear();
}
3.6. Acessando Variáveis de Ambiente
System também fornece acesso somente leitura a variáveis de ambiente comgetenv.
Se quisermos acessar a variável de ambientePATH, por exemplo, podemos fazer:
public String getPath() {
return System.getenv("PATH");
}
3.7. Administrando a coleta de lixo
Normalmente, os esforços de coleta de lixo são opacos aos nossos programas. Ocasionalmente, porém, podemos fazer uma sugestão direta à JVM.
System.runFinalization é um método que nos permite sugerir que a JVM execute sua rotina de finalização.
System.gc é um método que nos permite sugerir que a JVM execute sua rotina de coleta de lixo.
Uma vez que os contratos desses dois métodos não garantem que a finalização ou a coleta de lixo serão executadas, sua utilidade é limitada.
No entanto, eles podem ser exercitados como uma otimização, digamos, invocargc quando um aplicativo de desktop for minimizado:
public void windowStateChanged(WindowEvent event) {
if ( event == WindowEvent.WINDOW_DEACTIVATED ) {
System.gc(); // if it ends up running, great!
}
}
Para mais informações sobre finalização, confira nossofinalize guide.
4. Conclusão
Neste artigo, vimos alguns dos campos e métodos fornecidos porSystem. A lista completa pode ser encontrada emofficial System documentation.
Além disso, verifique todos os exemplos neste artigoover on Github.