java.lang.System 퀵 가이드

1. 개요

이 튜토리얼에서 우리는 java.lang.System 클래스와 그 특징과 핵심 기능에 대해 간단히 살펴볼 것 입니다.

2. IO

시스템java.lang 의 일부이며 주요 기능 중 하나는 표준 I / O 스트림에 대한 액세스를 제공하는 것입니다.

간단히 말해, 각 스트림에 대해 하나씩 세 개의 필드를 노출합니다.

  • 오류

2.1. System.out

System.out 은 표준 출력 스트림을 가리키고이를 PrintStream 으로 노출하고이를 사용하여 콘솔에 텍스트를 인쇄 할 수 있습니다.

System.out.print("some inline message");

System 의 고급 사용법은 System.setOut 을 호출 하는 것입니다. System.out 이 쓸 위치를 사용자 정의하는 데 사용할 수 있습니다 .

// Redirect to a text file System.setOut(new PrintStream("filename.txt"));

2.2. System.err

System.errSystem.out 과 매우 유사 합니다. 두 필드 모두 PrintStream의 인스턴스 이며 둘 다 콘솔에 메시지를 인쇄하기위한 것입니다.

그러나 System.err 은 표준 오류를 나타내며 특히 오류 메시지를 출력하는 데 사용합니다.

System.err.print("some inline error message"); 

콘솔은 종종 출력 스트림과 다르게 오류 스트림을 렌더링합니다.

자세한 내용은 PrintStream 설명서를 확인하십시오 .

2.3. System.in

System.in 은 표준 in을 가리키고이를 InputStream 으로 노출 하고 콘솔에서 입력을 읽는 데 사용할 수 있습니다.

조금 더 관련이 있지만 다음을 관리 할 수 ​​있습니다.

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

System.in.read 를 호출 하면 응용 프로그램이 중지되고 표준 입력에서 입력을 기다립니다. 다음 길이 바이트가 무엇이든 스트림에서 읽고 바이트 배열에 저장합니다.

사용자가 입력 한 다른 모든 항목은 스트림에 남아 다른 호출이 읽기를 기다 립니다.

물론 낮은 수준에서 작동하는 것은 어렵고 오류가 발생하기 쉬우므로 BufferedReader 로 조금 정리할 수 있습니다 .

public String readUsername() throws IOException { BufferedReader reader = new BufferedReader( new InputStreamReader(System.in)); return reader.readLine(); }

위의 배열을 사용하면 readLine 은 사용자가 return 을 누를 때까지 System.in 에서 읽습니다 .

이 경우 의도적으로 스트림을 닫지 않습니다. 표준 닫는 것은 프로그램의 수명주기 동안 다시 읽을 수 없음 의미합니다!

마지막으로 System.in 의 고급 사용법은 System.setIn 을 호출 하여 다른 InputStream 으로 리디렉션하는 것 입니다.

3. 유틸리티 방법

시스템 은 다음과 같은 작업에 도움이되는 다양한 방법을 제공합니다.

  • 콘솔에 액세스
  • 배열 복사
  • 날짜와 시간 관찰
  • JRE 종료
  • 런타임 속성에 액세스
  • 환경 변수에 액세스
  • 가비지 수집 관리

3.1. 콘솔에 액세스

Java 1.6은 단순히 System.outin을 직접 사용하는 것보다 콘솔과 상호 작용하는 또 다른 방법을 도입 했습니다 .

System.console 을 호출하여 액세스 할 수 있습니다 .

public String readUsername() { Console console = System.console(); return console == null ? null : console.readLine("%s", "Enter your name: "); }

기본 운영 체제와 현재 프로그램을 실행하기 위해 Java를 실행하는 방법에 따라 콘솔null을 반환 할 수 있으므로을 사용하기 전에 항상 확인하십시오 .

더 많은 용도에 대해서는 콘솔 문서를 확인하십시오.

3.2. 배열 복사

System.arraycopy 는 한 배열을 다른 배열로 복사하는 C 스타일의 오래된 방법입니다.

대부분 arraycopy 는 하나의 완전한 어레이를 다른 어레이로 복사하기위한 것입니다.

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

그러나 두 배열의 시작 위치와 복사 할 요소의 수를 지정할 수 있습니다.

예를 들어, a [1] 에서 시작 하여 b 로 시작하여 b [3] 에서 시작 하는 2 개의 요소를 a 에서 복사한다고 가정 해 보겠습니다 .

System.arraycopy(a, 1, b, 3, 2); assertArrayEquals(new int[] {0, 0, 0, 22, 44, 0}, b);

또한 arraycopy 는 다음을 던집니다.

  • 두 배열 중 하나가 null 인 경우 NullPointerException
  • IndexOutOfBoundsException 복사본이 범위를 벗어난 배열을 참조하는 경우
  • 복사 결과 유형이 일치하지 않는 경우 ArrayStoreException

3.3. 날짜 및 시간 관찰

System 에는 시간과 관련된 두 가지 방법이 있습니다 . 하나는 currentTimeMillis 이고 다른 하나는 nanoTime 입니다.

currentTimeMillis 는 1970 년 1 월 1 일 12:00 AM UTC 인 Unix Epoch 이후 경과 된 밀리 초 수를 반환합니다.

public long nowPlusOneHour() { return System.currentTimeMillis() + 3600 * 1000L; } public String nowPrettyPrinted() { return new Date(System.currentTimeMillis()).toString(); } 

nanoTime 은 JVM 시작에 상대적인 시간을 반환합니다. 애플리케이션에서 시간의 흐름을 표시하기 위해 여러 번 호출 할 수 있습니다.

long startTime = System.nanoTime(); // ... long endTime = System.nanoTime(); assertTrue(endTime - startTime < 10000); 

참고 그 이후 nanoTime는 세분화 된, 그래서있다 가 할 안전합니다 endTime- 사용자 - startTime을 <10000 이상의 endTime- 사용자 <startTime을을 인하여 수치 오버 플로우의 가능성 .

3.4. 프로그램 종료

현재 실행중인 프로그램을 프로그래밍 방식으로 종료하려면 System.exit 가 트릭을 수행합니다.

exit 를 호출하려면 프로그램을 시작한 콘솔이나 셸로 보낼 종료 코드를 지정해야합니다.

유닉스에서 관례 적으로 0 상태는 정상적인 종료를 의미하고 0이 아닌 것은 오류가 발생했음을 의미합니다.

if (error) { System.exit(1); } else { System.exit(0); }

요즘 대부분의 프로그램에서 이것을 호출하는 것이 이상 할 것입니다. 예를 들어 웹 서버 애플리케이션에서 호출하면 전체 사이트가 다운 될 수 있습니다!

3.5. 런타임 속성 액세스

시스템getProperty를 사용하여 런타임 속성에 대한 액세스를 제공합니다 .

그리고 setPropertyclearProperty로 관리 할 수 ​​있습니다 .

public String getJavaVMVendor() { System.getProperty("java.vm.vendor"); } System.setProperty("abckey", "abcvaluefoo"); assertEquals("abcvaluefoo", System.getProperty("abckey")); System.clearProperty("abckey"); assertNull(System.getProperty("abckey"));

-D 를 통해 지정된 속성 은 getProperty 를 통해 액세스 할 수 있습니다 .

기본값을 제공 할 수도 있습니다.

System.clearProperty("dbHost"); String myKey = System.getProperty("dbHost", "db.host.com"); assertEquals("db.host.com", myKey);

And System.getProperties provides a collection of all system properties:

Properties properties = System.getProperties();

From which we can do any Properties operations:

public void clearAllProperties() { System.getProperties().clear(); }

3.6. Accessing Environment Variables

System also provides read-only access to environment variables with getenv.

If we want to access the PATH environment variable, for example, we can do:

public String getPath() { return System.getenv("PATH"); }

3.7. Administering Garbage Collection

Typically, garbage collection efforts are opaque to our programs. On occasion, though, we may want to make a direct suggestion to the JVM.

System.runFinalization is a method that allows us to suggest that the JVM run its finalize routine.

System.gc 는 JVM이 가비지 콜렉션 루틴을 실행하도록 제안 할 수있는 메소드입니다.

이 두 가지 방법의 계약은 종료 또는 가비지 수집이 실행되는 것을 보장하지 않으므로 그 유용성은 좁습니다.

그러나 데스크톱 앱이 최소화 될 때 gc 를 호출하는 것과 같이 최적화로 실행할 수 있습니다 .

public void windowStateChanged(WindowEvent event) { if ( event == WindowEvent.WINDOW_DEACTIVATED ) { System.gc(); // if it ends up running, great! } }

마무리에 대한 자세한 내용은 마무리 가이드를 확인하세요.

4. 결론

이 기사에서는 System이 제공 하는 필드와 방법 중 일부를 살펴 보았습니다 . 전체 목록은 공식 시스템 문서에서 찾을 수 있습니다.

또한 Github에서이 기사의 모든 예제를 확인하십시오.