Java : System - API使用例
System (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Systemクラスには有用なクラス・フィールドおよびメソッドがあります。 インスタンス化することはできません。 Systemクラスによって得られる機能には、標準入力、標準出力、およびエラー出力ストリーム、外部的に定義されたプロパティおよび環境変数へのアクセス、ファイルおよびライブラリのローディング方法、配列の一部をすばやくコピーするユーティリティ・メソッドがあります。
Systemクラスは、Javaシステムの基幹となる
- 標準出力、標準入力、エラー出力
- プロパティや環境変数へのアクセス
- JNIライブラリのロード
などの機能を持ちます。
System.out.println("1234");
System.out.println("abcd");
// 結果 (標準出力)
// ↓
//1234
//abcd
// プロパティ
System.out.println(System.getProperty("java.specification.version")); // 18
System.out.println(System.getProperty("os.name")); // Windows 10
System.out.println(System.getProperty("file.encoding")); // UTF-8
フィールド
static final PrintStream err
「標準」エラー出力ストリームです。
出力には、PrintStream の各種メソッドが使えます。
System.err.println(1234);
System.err.println("abcd");
System.err.printf("num = %d", 789);
// 結果 (標準エラー出力)
// ↓
//1234
//abcd
//num = 789
static final InputStream in
「標準」入力ストリームです。
final var scanner = new Scanner(System.in);
// コンソールから abcde Enter と入力
final var line = scanner.nextLine();
System.out.println(line); // abcde
static final PrintStream out
「標準」出力ストリームです。
出力には、PrintStream の各種メソッドが使えます。
System.out.println(1234);
System.out.println("abcd");
System.out.printf("num = %d", 789);
// 結果 (標準出力)
// ↓
//1234
//abcd
//num = 789
メソッド
static void arraycopy (Object src, int srcPos, Object dest, int destPos, int length)
指定位置で開始する指定ソース配列から、転送先配列の指定位置に配列をコピーします。
final int[] src = {1, 2, 3, 4};
final int[] dst1 = new int[4];
final int[] dst2 = new int[4];
final int[] dst3 = new int[4];
final int[] dst4 = new int[4];
System.out.println(Arrays.toString(src)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(dst1)); // [0, 0, 0, 0]
System.out.println(Arrays.toString(dst2)); // [0, 0, 0, 0]
System.out.println(Arrays.toString(dst3)); // [0, 0, 0, 0]
System.out.println(Arrays.toString(dst4)); // [0, 0, 0, 0]
System.arraycopy(src, 0, dst1, 0, 4);
System.arraycopy(src, 0, dst2, 0, 3);
System.arraycopy(src, 0, dst3, 0, 2);
System.arraycopy(src, 0, dst4, 0, 1);
System.out.println(Arrays.toString(dst1)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(dst2)); // [1, 2, 3, 0]
System.out.println(Arrays.toString(dst3)); // [1, 2, 0, 0]
System.out.println(Arrays.toString(dst4)); // [1, 0, 0, 0]
final int[] src = {1, 2, 3, 4};
final int[] dst1 = new int[4];
final int[] dst2 = new int[4];
final int[] dst3 = new int[4];
final int[] dst4 = new int[4];
System.arraycopy(src, 0, dst1, 0, 4);
System.arraycopy(src, 1, dst2, 0, 3);
System.arraycopy(src, 2, dst3, 0, 2);
System.arraycopy(src, 3, dst4, 0, 1);
System.out.println(Arrays.toString(dst1)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(dst2)); // [2, 3, 4, 0]
System.out.println(Arrays.toString(dst3)); // [3, 4, 0, 0]
System.out.println(Arrays.toString(dst4)); // [4, 0, 0, 0]
final int[] src = {1, 2, 3, 4};
final int[] dst1 = new int[4];
final int[] dst2 = new int[4];
final int[] dst3 = new int[4];
final int[] dst4 = new int[4];
System.arraycopy(src, 0, dst1, 0, 4);
System.arraycopy(src, 0, dst2, 1, 3);
System.arraycopy(src, 0, dst3, 2, 2);
System.arraycopy(src, 0, dst4, 3, 1);
System.out.println(Arrays.toString(dst1)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(dst2)); // [0, 1, 2, 3]
System.out.println(Arrays.toString(dst3)); // [0, 0, 1, 2]
System.out.println(Arrays.toString(dst4)); // [0, 0, 0, 1]
static String clearProperty (String key)
指定されたキーによって示されたシステム・プロパティを削除します。
System.out.println(System.getProperty("aaa")); // null
System.out.println(System.setProperty("aaa", "bbb")); // null
System.out.println(System.getProperty("aaa")); // "bbb"
System.out.println(System.clearProperty("aaa")); // "bbb"
System.out.println(System.getProperty("aaa")); // null
static Console console ()
現在のJava仮想マシンに関連した一意のConsoleオブジェクトがある場合に、それを返します。
final var console = System.console();
if (console != null) {
// コンソールから abcd Enter と入力
// ※ readPassword では入力文字のエコーがなくなります。
final var password = console.readPassword();
System.out.println(Arrays.toString(password)); // [a, b, c, d]
Arrays.fill(password, '\0');
System.out.println(Arrays.toString(password)); // [ , , , ]
}
static long currentTimeMillis ()
ミリ秒で表される現在の時間を返します。
「1970/01/01 00:00:00(UTC)」から「現在時刻(UTC)」までの経過時間をミリ秒で返します。
final var millis = System.currentTimeMillis();
System.out.println(millis); // 1634277516458
final var instant = Instant.ofEpochMilli(millis);
System.out.println(instant); // 2021-10-15T05:58:36.458Z
final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo
// 日本時間で表示。
final var zonedDateTime = ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(zonedDateTime); // 2021-10-15T14:58:36.458+09:00[Asia/Tokyo]
currentTimeMillis 以外の現在時刻の取得方法については
の記事もご参照ください。
static void exit (int status)
現在実行しているJava仮想マシンを終了します。
public class Main {
public static void main(String[] args) {
System.out.println("exit : before");
System.exit(999);
// こちらは表示されません。
System.out.println("exit : after");
}
}
PowerShellで実行した結果です。
PS R:\java-work> java Main
exit : before
PS R:\java-work> $LastExitCode
999
static void gc ()
Java Virtual Machineでガベージ・コレクタを実行します。
ガベージ・コレクタは自動的に実行されるため、基本的には明示的に呼び出さなくてもOKです。
// ... いろいろなにか処理 ...
System.gc();
static Map<String,String> getenv ()
現在のシステム環境の変更できない文字列マップのビューを返します。
final var envMap = System.getenv();
envMap.forEach((key, value) -> System.out.println(key + " : " + value));
// 結果 (一部抜粋)
// ↓
//...
//OS : Windows_NT
//PUBLIC : C:\Users\Public
//SESSIONNAME : Console
//...
static String getenv (String name)
指定された環境変数の値を取得します。
System.out.println(System.getenv("OS")); // Windows_NT
System.out.println(System.getenv("PUBLIC")); // C:\Users\Public
System.out.println(System.getenv("SESSIONNAME")); // Console
static System.Logger getLogger (String name)
呼び出し元が使用するLoggerのインスタンスを返します。
デフォルトでは、Java標準のロギングAPIが使われます。
final var logger = System.getLogger("com.example.lang.system");
logger.log(System.Logger.Level.INFO, "ログテスト : 1");
logger.log(System.Logger.Level.INFO, "ログテスト : 2");
logger.log(System.Logger.Level.INFO, "ログテスト : 3");
// 結果
// ↓
//2月 12, 2022 6:43:35 午後 com.example.lang.system.SystemTest getLogger
//情報: ログテスト : 1
//2月 12, 2022 6:43:35 午後 com.example.lang.system.SystemTest getLogger
//情報: ログテスト : 2
//2月 12, 2022 6:43:35 午後 com.example.lang.system.SystemTest getLogger
//情報: ログテスト : 3
static System.Logger getLogger (String name, ResourceBundle bundle)
呼び出し側が使用するLoggerのローカライズ可能なインスタンスを返します。
デフォルトでは、Java標準のロギングAPIが使われます。
package com.example.lang.system;
import java.util.ListResourceBundle;
public class LoggerResourceBundle extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return new Object[][]{
{"SAMPLE", "サンプル"}
};
}
}
final var bundle = ResourceBundle.getBundle("com.example.lang.system.LoggerResourceBundle");
final var logger = System.getLogger("com.example.lang.system", bundle);
logger.log(System.Logger.Level.INFO, "SAMPLE");
// 結果
// ↓
//2月 12, 2022 6:43:59 午後 com.example.lang.system.SystemTest getLogger_resourceBundle
//情報: サンプル
static Properties getProperties ()
現在のシステム・プロパティを決定します。
final var properties = System.getProperties();
properties.forEach((key, value) -> System.out.println(key + " : " + value));
// 結果 (一部抜粋)
// ↓
//...
//java.specification.version : 18
//os.name : Windows 10
//file.encoding : UTF-8
//...
static String getProperty (String key)
指定されたキーによって示されるシステム・プロパティを取得します。
System.out.println(System.getProperty("java.specification.version")); // 18
System.out.println(System.getProperty("os.name")); // Windows 10
System.out.println(System.getProperty("file.encoding")); // UTF-8
static String getProperty (String key, String def)
指定されたキーによって示されるシステム・プロパティを取得します。
System.out.println(System.getProperty("aaa")); // null
System.out.println(System.getProperty("aaa", "xxx")); // "xxx"
System.out.println(System.setProperty("aaa", "bbb")); // null
System.out.println(System.getProperty("aaa")); // "bbb"
System.out.println(System.getProperty("aaa", "xxx")); // "bbb"
static SecurityManager getSecurityManager ()
削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。
非推奨です。
static int identityHashCode (Object x)
指定されたオブジェクトのクラスがhashCode()をオーバーライドしているかどうかに関係なく、デフォルトのhashCode()メソッドにより返されるものと同じ、指定されたオブジェクトのハッシュ・コードを返します。
// 意図的にインスタンスを別にするために、Stringをnewで生成しています。
final var s1 = new String("aaa");
final var s2 = new String("aaa");
System.out.println(s1 != s2); // true
System.out.println(s1.hashCode()); // 96321
System.out.println(s2.hashCode()); // 96321
System.out.println(System.identityHashCode(s1)); // 1551726463
System.out.println(System.identityHashCode(s2)); // 304216540
static Channel inheritedChannel ()
Java仮想マシンを作成したエンティティから継承されたチャネルを返します。
final var channel = System.inheritedChannel();
System.out.println(channel); // null
通常のアプリとして実行しても null が返ります。
インターネット・サービス・デーモン(inetd)経由だと、そのソケットを継承したチャンネルが返されるようです。
詳しくは、API仕様の SelectorProvider.inheritedChannel もご確認ください。
まだ動作を確認しきれていないため、コード例も準備できていません。
(いずれ更新するかもしれません…)
static String lineSeparator ()
システムに依存する行区切り文字列を返します。
// CR
System.out.println(Integer.toString('\r')); // 13
// LF
System.out.println(Integer.toString('\n')); // 10
final var separator = System.lineSeparator();
final var codePoints = separator.codePoints().toArray();
System.out.println(Arrays.toString(codePoints));
// Windows 10 で実行した結果
// ↓
// [13, 10]
// Linux で実行した結果
// ↓
// [10]
static void load (String filename)
filename引数によって指定されたネイティブ・ライブラリをロードします。
※Windows 10 で実行した例となります。
public class JniSample {
public native int sum(int a, int b);
}
JNI用のコード(cpp)
JNIEXPORT jint JNICALL Java_JniSample_sum
(JNIEnv*, jobject, jint a, jint b) {
return a + b;
}
DLLを作成して R:\java-work\lib\JniSample.dll に配置します。
public class JniMain {
public static void main(String[] args) {
final var libPath = Path.of("R:", "java-work", "lib", "JniSample.dll");
System.out.println(libPath); // R:\java-work\lib\JniSample.dll
System.load(libPath.toString());
final var sample = new JniSample();
final var ret = sample.sum(100, 200);
System.out.println(ret); // 300
}
}
static void loadLibrary (String libname)
引数libnameによって指定されるネイティブ・ライブラリをロードします。
※Windows 10 で実行した例となります。
public class JniSample {
public native int sum(int a, int b);
}
JNI用のコード(cpp)
JNIEXPORT jint JNICALL Java_JniSample_sum
(JNIEnv*, jobject, jint a, jint b) {
return a + b;
}
DLLを作成して R:\java-work\lib\JniSample.dll に配置します。
public class JniMain {
public static void main(String[] args) {
System.loadLibrary("JniSample");
final var sample = new JniSample();
final var ret = sample.sum(100, 200);
System.out.println(ret); // 300
}
}
javaコマンドのオプション(-D)で、java.library.pathプロパティにdllを配置したディレクトリを指定します。
java -D"java.library.path=R:\java-work\lib" JniMain
static String mapLibraryName (String libname)
ライブラリ名を、ネイティブ・ライブラリを表すプラットフォーム依存の文字列にマッピングします。
final var name = System.mapLibraryName("JniSample");
System.out.println(name);
// Windows 10 で実行した結果
// ↓
// JniSample.dll
// Linux で実行した結果
// ↓
// libJniSample.so
static long nanoTime ()
実行中のJava仮想マシンの高精度時間ソースの現在値を、ナノ秒の単位で返します。
...
このメソッドから返される値に意味があるのは、Java仮想マシンの同じインスタンス内で得られたそうした2つの値の差を計算する場合だけです。
注意
- このメソッドは現在時刻を取得するためのものではありません。
2つの時点の差分を取るためにのみ使います。
final var start = System.nanoTime();
System.out.println(start); // 16097871697500
Thread.sleep(1000);
final var end = System.nanoTime();
System.out.println(end); // 16098873570100
// 経過秒を表示します。
final var sec = (end - start) / 1000000000.0;
System.out.println(sec + " 秒"); // 1.0018726 秒
static void runFinalization ()
削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 最終決定は削除のために非推奨になりました。
非推奨です。
static void setErr (PrintStream err)
「標準」エラー出力ストリームを割り当てし直します。
final var outputStream = new ByteArrayOutputStream();
System.setErr(new PrintStream(outputStream));
System.err.println("abcde");
System.out.println("outputStream : " + outputStream);
// 結果
// ↓
//outputStream : abcde
static void setIn (InputStream in)
「標準」入力ストリームを割り当てし直します。
// 入力となるデータ。
final var bytes = "abcde\n".getBytes();
System.setIn(new ByteArrayInputStream(bytes));
final var scanner = new Scanner(System.in);
final var line = scanner.nextLine();
System.out.println(line); // abcde
static void setOut (PrintStream out)
「標準」出力ストリームを割り当てし直します。
final var outputStream = new ByteArrayOutputStream();
System.setOut(new PrintStream(outputStream));
System.out.println("abcde");
System.err.println("outputStream : " + outputStream);
// 結果
// ↓
//outputStream : abcde
static void setProperties (Properties props)
システム・プロパティを引数Propertiesに設定します。
final var src = new Properties();
src.putAll(System.getProperties());
src.setProperty("aaa", "xxx");
src.setProperty("bbb", "yyy");
src.setProperty("ccc", "zzz");
System.setProperties(src);
final var dst = System.getProperties();
dst.forEach((key, value) -> System.out.println(key + " : " + value));
// 結果 (一部抜粋)
// ↓
//...
//java.specification.version : 18
//os.name : Windows 10
//file.encoding : UTF-8
//...
//aaa : xxx
//bbb : yyy
//ccc : zzz
static String setProperty (String key, String value)
指定されたキーによって示されるシステム・プロパティを設定します。
System.out.println(System.getProperty("aaa")); // null
System.out.println(System.setProperty("aaa", "bbb")); // null
System.out.println(System.getProperty("aaa")); // "bbb"
static void setSecurityManager (SecurityManager sm)
削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。
非推奨です。
関連記事
- API 使用例