java.lang.Systemのクイックガイド
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]のすべての例をチェックしてください。