1概要

このチュートリアルでは、

java.lang.System

クラスとその機能およびコア機能について簡単に説明します。


2 IO


System



java.lang

の一部です。その主な機能の1つは、標準のI/Oストリームにアクセスできるようにすることです。

簡単に言うと、ストリームごとに1つずつ、3つのフィールドを公開します。


  • でる


  • err


  • in


2.1.

System.out



System.out

は標準出力ストリームをポイントし、それを

PrintStream

として公開します。これを使用してテキストをコンソールに出力できます。

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


System

の高度な使い方は、

System.setOut

を呼び出すことです。

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


2.2.

System.err



System.err



System.out

とよく似ています。両方のフィールドは

PrintStream、

のインスタンスであり、両方ともメッセージをコンソールに出力するためのものです。

しかし

System.err

は標準エラーを表しており、エラーメッセージを出力するために特に使用します。

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

多くの場合、コンソールはエラーストリームを出力ストリームとは異なる方法でレンダリングします。

詳細については、https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html[

PrintStream

]のドキュメントを確認してください。


2.3.

System.in



System.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

を呼び出すことで、アプリケーションは標準入力からの入力を停止して待機します。次の

length

バイトがストリームから読み取られ、バイト配列に格納される場合は、その処理が行われます。

  • ユーザが入力した他のものはすべてストリームに残り、

    read.

    への別の呼び出しを待ちます。

もちろん、最低レベルで操作するのはやりがいがあり、エラーが発生しやすいので、

BufferedReader

を使用して少しでもクリーンアップできます。

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

上記の配置では、

readLine

はユーザーがreturnを押すまで

System.in

から読み込まれます。これは予想されるものに少し近いです。

この場合、意図的にストリームを閉じることはしないでください。

標準の

in


を閉じることは、プログラムのライフサイクルの間、それを再び読むことができないことを意味します!**

そして最後に、

System.in

の高度な使い方は

System.setIn

を呼び出して別の

InputStream

にリダイレクトすることです。


3実用的な方法


System

は、次のようなことを支援するための多数の方法を提供しています。

  • コンソールへのアクセス

  • 配列のコピー

  • 観測日時

  • JREを終了する

  • ランタイムプロパティへのアクセス

  • 環境変数へのアクセス

  • ガベージコレクションの管理


3.1. コンソールへのアクセス

Java 1.6では、

System.out



in

を直接使用する以外に、コンソールと対話するための別の方法が導入されました。


System.console

を呼び出してアクセスできます。

public String readUsername() {
    Console console = System.console();

    return console == null ? null :
      console.readLine("%s", "Enter your name: ");
}

基礎となるオペレーティングシステムや、現在のプログラムを実行するためのJavaの起動方法によっては、


console

が__nullを返す場合があるので、必ず

を使用する前に確認してください。

その他の用途については、https://docs.oracle.com/javase/7/docs/api/java/io/Console.html[Console]のドキュメントを参照してください。


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

から

a[1]

で始まる2つの要素を

b[3]

で始まる

b

にコピーするとします。

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

には、時間に関する2つの方法があります。 1つは

currentTimeMillis

、もう1つは

nanoTime

です。


currentTimeMillis

は、UNIXエポック(1970年1月1日12:00 AM UTC)から経過したミリ秒数を返します。

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

はきめ細かいので、


https://docs.oracle.com/javase/8/docs/api/java/lang/Systemのため、


endTime <startTime

より

endTime – startTime <10000

の方が安全です.html#nanoTime[数値オーバーフローの可能性]


3.4. プログラムを終了する

プログラムで現在実行されているプログラムを終了したい場合は、

System.exit

がうまくいきます。


exit

を呼び出すには、プログラムを起動したコンソールまたはシェルに送信される終了コードを指定する必要があります。

Unixの慣例では、ステータス0は正常終了を意味し、ゼロ以外は何らかのエラーが発生したことを意味します。

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

最近のほとんどのプログラムでは、これを呼び出す必要があるのは奇妙なことです。たとえば、Webサーバーアプリケーションで呼び出されると、サイト全体が停止する可能性があります。


3.5. ランタイムプロパティへのアクセス


System

は、

getProperty

を使用してランタイムプロパティへのアクセスを提供します。

そして

setProperty



clearProperty

でそれらを管理することができます。

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

そして

System.getProperties

はすべてのシステムプロパティのコレクションを提供します。

Properties properties = System.getProperties();

そこから任意の

Properties

操作を実行できます。

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


3.6. 環境変数へのアクセス


System

は、

getenv

を使用して環境変数への読み取り専用アクセスも提供します。

たとえば、

PATH

環境変数にアクセスしたい場合は、次のようにします。

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


3.7. ガベージコレクションの管理

一般的に、ガベージコレクションの取り組みは私たちのプログラムにとっては不透明です。ただし、場合によっては、JVMに直接提案することをお勧めします。


System.runFinalization

は、JVMがfinalizeルーチンを実行することを提案するためのメソッドです。


System.gc

は、JVMがガベージコレクションルーチンを実行するように提案するためのメソッドです。

  • これら2つの方法の契約は、ファイナライズまたはガベージコレクションが実行されることを保証するものではないので、それらの有用性は狭いです。

ただし、デスクトップアプリケーションが最小化されたときに

gc

を呼び出すなど、最適化として実行することもできます。

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

ファイナライズの詳細については、私たちのリンクをチェックしてください:/java-finalize[ファイナライズガイド]。


4結論

この記事では、

System

が提供するフィールドとメソッドのいくつかを見てきました。完全なリストはhttps://docs.oracle.com/javase/7/docs/api/java/lang/System.html[システムの公式ドキュメント]にあります。

また、この記事https://github.com/eugenp/tutorials/tree/master/core-java-lang-syntax[over on Github]のすべての例をチェックしてください。