Guia rápido para java.lang.System

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.