console.writeline e System.out.println

120

Qual é exatamente a diferença técnica entre console.writelinee System.out.println? Eu sei que System.out.printlnescreve na saída padrão, mas isso não é a mesma coisa que o console?

Não compreendo completamente a documentação para console.writeline.

ziggy
fonte
6
Também Console.WriteLine não é um método java (é .net) ... mas eu entendo o que você está pedindo :)
robert_x44

Respostas:

130

Aqui estão as principais diferenças entre usar System.out/ .err/.in e System.console():

  • System.console()retorna nulo se seu aplicativo não for executado em um terminal ( embora você possa lidar com isso em seu aplicativo )
  • System.console() fornece métodos para ler a senha sem repetir os caracteres
  • System.oute System.erruse a codificação da plataforma padrão, enquanto os Consolemétodos de saída de classe usam a codificação do console

Esse último comportamento pode não ser imediatamente óbvio, mas código como este pode demonstrar a diferença:

public class ConsoleDemo {
  public static void main(String[] args) {
    String[] data = { "\u250C\u2500\u2500\u2500\u2500\u2500\u2510", 
        "\u2502Hello\u2502",
        "\u2514\u2500\u2500\u2500\u2500\u2500\u2518" };
    for (String s : data) {
      System.out.println(s);
    }
    for (String s : data) {
      System.console().writer().println(s);
    }
  }
}

No meu Windows XP, que possui uma codificação de sistema do windows-1252 e uma codificação de console padrão do IBM850, este código escreverá:

???????
?Hello?
???????
┌─────┐
Hello
└─────┘

Observe que esse comportamento depende da codificação do console ser definida como uma codificação diferente da codificação do sistema. Esse é o comportamento padrão no Windows por vários motivos históricos.

McDowell
fonte
Você pode obter um exemplo de não rodar em um terminal?
Chao
@ Richard, se você clicar em executar a partir de um IDE ou se iniciar um jar executável a partir de uma GUI.
aioobe
15

Eles são essencialmente os mesmos, se o seu programa for executado a partir de um prompt interativo e você não redirecionou stdin ou stdout:

public class ConsoleTest {
    public static void main(String[] args) {
        System.out.println("Console is: " + System.console());
    }
}

resulta em:

$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null

O motivo Consoleexiste é fornecer recursos úteis no caso específico em que você está sendo executado a partir de uma linha de comando interativa:

  • entrada segura de senha (difícil de fazer plataforma cruzada)
  • sincronização (vários encadeamentos podem solicitar entrada e Consoleenfileirá-los muito bem, enquanto que se você usasse System.in/out, todos os prompts apareceriam simultaneamente).

Observe acima que o redirecionamento de até mesmo um dos fluxos resulta em System.console()retorno null; outra irritação é que muitas vezes não há Consoleobjeto disponível quando gerado por outro programa como o Eclipse ou o Maven.

SimonJ
fonte
7

Primeiro, receio que sua pergunta contenha um pequeno erro. Não há método writeline na classe Console. Em vez disso, a classe Console fornece o método writer () que retorna PrintWriter. Este gravador de impressão possui println ().

Agora, qual é a diferença entre

System.console().writer().println("hello from console");

e

System.out.println("hello system out");

Se você executar seu aplicativo na linha de comando, acho que não há diferença. Mas se o console estiver indisponível, System.console () retornará nulo enquanto System.out ainda existir. Isso pode acontecer se você chamar seu aplicativo e executar o redirecionamento de STDOUT para o arquivo.

Aqui está um exemplo que acabei de implementar.

import java.io.Console;


public class TestConsole {
    public static void main(String[] args) {
        Console console = System.console();
        System.out.println("console=" + console);
        console.writer().println("hello from console");
    }
}

Quando executei o aplicativo no prompt de comando, obtive o seguinte:

$ java TestConsole
console=java.io.Console@93dcd
hello from console

mas quando redirecionei o STDOUT para o arquivo ...

$ java TestConsole >/tmp/test
Exception in thread "main" java.lang.NullPointerException
        at TestConsole.main(TestConsole.java:8)

A linha 8 é console.writer().println().

Aqui está o conteúdo de / tmp / test

console=null

Espero que minhas explicações ajudem.

AlexR
fonte
Para fazer com que o código apareça como blocos de código, indente cada linha com quatro espaços. (Acabei de fazer isso para você, no entanto.)
BoltClock
Há, no entanto, um Console.printf e um Console.format, ambos gravados diretamente, sem a necessidade de extrair o PrintWriter intermediário. Estranho :)
Toby Eggitt
3

Não há Console.writelineem Java. É no .NET.

Console e saída padrão não são os mesmos. Se você ler a página Javadoc mencionada , verá que um aplicativo pode ter acesso a um console apenas se for chamado a partir da linha de comando e a saída não for redirecionada dessa maneira

java -jar MyApp.jar > MyApp.log

Outros casos são abordados na resposta de SimonJ, embora ele tenha perdido o argumento de que não há Console.writeline.

Nithesh Chandra
fonte
Sim - eu imaginei que o compilador do ziggy (ou os Javadocs) poderia fazer esse trabalho por mim :) #
294 SimonJ