java.lang.Systemのクイックガイド
1. 概要
このチュートリアルでは、java.lang.Systemクラスとその機能およびコア機能について簡単に説明します。
2. IO
Systemはjava.langの一部であり、その主な機能の1つは、標準のI / Oストリームへのアクセスを提供することです。
簡単に言えば、ストリームごとに1つずつ、3つのフィールドを公開します。
-
out
-
err
-
in
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.errはSystem.outによく似ています。 両方のフィールドはPrintStream,のインスタンスであり、どちらもコンソールにメッセージを出力するためのものです。
ただし、System.errは標準エラーを表し、特にエラーメッセージを出力するために使用します。
System.err.print("some inline error message");
多くの場合、コンソールは出力ストリームとは異なるエラーストリームをレンダリングします。
詳細については、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バイトが何であれ、ストリームから読み取られ、バイト配列に格納されます。
Anything else typed by the user stays in the stream、read.への別の呼び出しを待機しています
もちろん、その低いレベルでの操作は困難でエラーが発生しやすい可能性があるため、BufferedReaderを使用して少しクリーンアップできます。
public String readUsername() throws IOException {
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
return reader.readLine();
}
上記の配置では、readLineは、ユーザーがreturnキーを押すまで、System.inから読み取ります。これは、予想に少し近いものです。
この場合、意図的にストリームを閉じないことに注意してください。 Closing the standard inmeans that it cannot be read again for the lifecycle of the program!
そして最後に、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 might return null, so always make sure to check before usingに注意してください。
その他の使用法については、Consoleのドキュメントを確認してください。
3.2. 配列のコピー
System.arraycopyは、ある配列を別の配列にコピーする古いCスタイルの方法です。
ほとんどの場合、arraycopyは、1つの完全な配列を別の配列にコピーすることを目的としています。
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の時間に関連する2つの方法があります。 1つはcurrentTimeMillisで、もう1つはnanoTimeです。
currentTimeMillisは、Unixエポック(1970年1月1日午前12:00 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は非常にきめ細かいため、it’s safer to do endTime – startTime < 10000 than endTime < startTime due to the possibility of numerical overflowであることに注意してください。
3.4. プログラムの終了
現在実行中のプログラムをプログラムで終了したい場合は、System.exitでうまくいきます。
exitを呼び出すには、プログラムを起動したコンソールまたはシェルに送信される終了コードを指定する必要があります。
Unixの慣例では、ステータス0は正常終了を意味し、ゼロ以外は何らかのエラーが発生したことを意味します。
if (error) {
System.exit(1);
} else {
System.exit(0);
}
最近のほとんどのプログラムでは、これを呼び出す必要があるのは奇妙なことに注意してください。 When called in a web server application, for example, it may take down the entire site!
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がファイナライズルーチンを実行することを提案できるようにするメソッドです。
System.gcは、JVMがガベージコレクションルーチンを実行することを提案できるようにするメソッドです。
これら2つの方法のコントラクトは、ファイナライズまたはガベージコレクションの実行を保証しないため、それらの有用性は狭いです。
ただし、デスクトップアプリが最小化されたときにgcを呼び出すなど、最適化として実行できます。
public void windowStateChanged(WindowEvent event) {
if ( event == WindowEvent.WINDOW_DEACTIVATED ) {
System.gc(); // if it ends up running, great!
}
}
ファイナライズの詳細については、finalize guideを確認してください。
4. 結論
この記事では、Systemが提供するフィールドとメソッドのいくつかを確認しました。 完全なリストはofficial System documentationにあります。
また、この記事over on Githubのすべての例を確認してください。