[java] console.writeline 및 System.out.println

console.writeline과 의 기술적 차이점은 정확히 무엇입니까 System.out.println? 나는 System.out.println표준 출력에 쓰는 것을 알고 있지만 이것은 콘솔과 같지 않습니까?

에 대한 문서 를 완전히 이해하지 못합니다 console.writeline.



답변

System.out/ .err/.in 및 사용의 주요 차이점은 다음 과 System.console()같습니다.

  • System.console()애플리케이션이 터미널에서 실행되지 않는 경우 null을 반환합니다 (애플리케이션에서 처리 할 수 ​​있음 ).
  • System.console() 에코 문자없이 암호를 읽는 방법을 제공합니다.
  • System.out그리고 System.err그동안 기본 플랫폼 인코딩을 사용하는 Console클래스 출력 방법은 콘솔 인코딩을 사용

이 후자의 동작은 즉시 명확하지 않을 수 있지만 다음과 같은 코드는 차이점을 보여줄 수 있습니다.

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

시스템 인코딩이 windows-1252이고 기본 콘솔 인코딩이 IBM850 인 Windows XP에서이 코드는 다음과 같이 작성합니다.

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

이 동작은 시스템 인코딩과 다른 인코딩으로 설정된 콘솔 인코딩에 따라 다릅니다. 이것은 많은 역사적 이유로 Windows의 기본 동작입니다.


답변

프로그램이 대화 형 프롬프트에서 실행되고 stdin 또는 stdout을 리디렉션하지 않은 경우 기본적으로 동일합니다.

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

결과 :

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

그 이유 Console는 대화 형 명령 줄에서 실행중인 특정 경우에 유용한 기능을 제공하기위한 것입니다.

  • 보안 암호 입력 (플랫폼 간 수행하기 어려움)
  • 동기화 (여러 스레드가 입력을 Console요청하고 멋지게 큐에 넣을 수 있지만 System.in/out을 사용하면 모든 프롬프트가 동시에 나타납니다).

스트림 중 하나 라도 리디렉션 하면 System.console()반환됩니다 null. 또 다른 자극은 ConsoleEclipse 또는 Maven과 같은 다른 프로그램에서 생성 될 때 사용 가능한 개체가 없는 경우가 많다는 것 입니다.


답변

먼저 귀하의 질문에 약간의 오류가 포함되어 있습니다. 콘솔 클래스에는 writeline 메소드가 없습니다. 대신 Console 클래스는 PrintWriter를 반환하는 writer () 메서드를 제공합니다. 이 인쇄 작성자는 println ()을 가지고 있습니다.

이제 차이점은 무엇입니까

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

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

명령 줄에서 응용 프로그램을 실행하면 차이가 없다고 생각합니다. 그러나 콘솔을 사용할 수없는 경우 System.console ()은 System.out이 여전히 존재하는 동안 null을 반환합니다. 이는 애플리케이션을 호출하고 STDOUT을 파일로 리디렉션하는 경우 발생할 수 있습니다.

다음은 방금 구현 한 예입니다.

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

명령 프롬프트에서 응용 프로그램을 실행하면 다음이 표시됩니다.

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

하지만 STDOUT을 파일로 리디렉션하면 …

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

8 행은 console.writer().println()입니다.

다음은 / tmp / test의 내용입니다.

console=null

내 설명이 도움이되기를 바랍니다.


답변

Console.writelineJava 에는 없습니다 . .NET에 있습니다.

콘솔과 표준 출력은 동일하지 않습니다. 언급 한 Javadoc 페이지를 읽으면 명령 줄에서 호출되고 출력이 다음과 같이 리디렉션되지 않는 경우에만 애플리케이션이 콘솔에 액세스 할 수 있음을 알 수 있습니다.

java -jar MyApp.jar > MyApp.log

다른 경우는 SimonJ의 답변에서 다루어 지지만 Console.writeline.


답변