console.writeline 및 System.out.println


120

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

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



6
또한 : console.writeline은 (는 그물입니다) 자바 방법은 아닙니다 ...하지만 난 당신이 요구하는지 이해
robert_x44

답변:


130

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의 기본 동작입니다.


터미널에서 실행되지 않는 예를 얻을 수 있습니까?
Chao

@Richard, IDE에서 실행을 누르거나 GUI에서 실행 가능한 jar를 시작하는 경우.
aioobe

15

프로그램이 대화 형 프롬프트에서 실행되고 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과 같은 다른 프로그램에서 생성 될 때 사용 가능한 개체가 없는 경우가 많다는 것 입니다.


7

먼저 귀하의 질문에 약간의 오류가 포함되어 있습니다. 콘솔 클래스에는 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

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


코드를 코드 블록으로 표시하려면 각 줄을 공백 4 개로 들여 씁니다. (방금 당신을 위해 그렇게했습니다.)
BoltClock

그러나 Console.printf 및 Console.format이 있으며 둘 다 중간에있는 PrintWriter를 추출 할 필요없이 직접 기록합니다. 이상한 :)
토비 Eggitt

3

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

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

java -jar MyApp.jar > MyApp.log

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


Yup-나는 ziggy의 컴파일러 (또는 Javadocs)가 나를 위해 그 일을 할 수 있다고 생각했습니다. :)
SimonJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.