広告

Java : System - API使用例

System (Java SE 21 & JDK 21) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。


概要

Systemクラスには有用なクラス・フィールドおよびメソッドがあります。 インスタンス化することはできません。 Systemクラスによって得られる機能には、標準入力、標準出力、およびエラー出力ストリーム、外部的に定義されたプロパティおよび環境変数へのアクセス、ファイルおよびライブラリのローディング方法、配列の一部をすばやくコピーするユーティリティ・メソッドがあります。

クラス構成

Systemクラスは、Javaシステムの基幹となる

  • 標準出力、標準入力、エラー出力
  • プロパティや環境変数へのアクセス
  • JNIライブラリのロード

などの機能を持ちます。

System.out.println("1234");
System.out.println("abcd");

// 結果 (標準出力)
// ↓
//1234
//abcd
final var ret1 = System.getProperty("java.specification.version");
System.out.println(ret1); // 21

final var ret2 = System.getProperty("os.name");
System.out.println(ret2); // Windows 10

フィールド

static final PrintStream err

「標準」エラー出力ストリームです。

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

// コンソールから abcd [Enter] と入力
final var line = scanner.nextLine();

System.out.println(line); // abcd

static final PrintStream out

「標準」出力ストリームです。

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

final var instant = Instant.ofEpochMilli(millis);
System.out.println(instant); // 2024-04-28T05:57:00.084Z

final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo

// 日本時間で表示。
final var zonedDateTime = ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(zonedDateTime); // 2024-04-28T14:57:00.084+09:00[Asia/Tokyo]

static void exit (int status)

Java Virtual Machineの「停止シーケンス」を開始します。

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でガベージ・コレクタを実行します。

var sb = new StringBuilder("abcd");
final var ref = new WeakReference<>(sb);

System.out.println(ref.get()); // abcd

sb = null;
System.out.println(ref.get()); // abcd

System.gc();
System.out.println(ref.get()); // null

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のインスタンスを返します。

関連 : ロギング(ログ出力)の基本

public class Main {
    public static void main(String[] args) {
        final var logger = System.getLogger("com.example.system");

        logger.log(System.Logger.Level.INFO, "TEST : 1");
        logger.log(System.Logger.Level.INFO, "TEST : 2");
        logger.log(System.Logger.Level.INFO, "TEST : 3");
    }
}

// --- PowerShell ---
//PS R:\java-work> java Main
//Apr 28, 2024 3:47:31 PM Main main
//INFO: TEST : 1
//Apr 28, 2024 3:47:31 PM Main main
//INFO: TEST : 2
//Apr 28, 2024 3:47:31 PM Main main
//INFO: TEST : 3

static System.Logger getLogger (String name, ResourceBundle bundle)

呼出し側の使用のためにLoggerのローカライズ可能なインスタンスを返します。

import java.util.ListResourceBundle;

public class LoggerResourceBundle extends ListResourceBundle {

    @Override
    protected Object[][] getContents() {
        return new Object[][]{
                {"aaa", "XXX"}
        };
    }
}
public class Main {
    public static void main(String[] args) {
        final var bundle = ResourceBundle.getBundle("LoggerResourceBundle");
        final var logger = System.getLogger("com.example.system", bundle);

        logger.log(System.Logger.Level.INFO, "aaa");
    }
}

// --- PowerShell ---
//PS R:\java-work> java Main
//Apr 28, 2024 3:51:01 PM Main main
//INFO: XXX

static Properties getProperties ()

現在のシステム・プロパティを決定します。

final var properties = System.getProperties();
properties.forEach((key, value) -> {
    System.out.println(key + " : " + value);
});

// 結果
// ↓
//...
//java.specification.version : 21
//os.name : Windows 10
//...

static String getProperty (String key)

指定されたキーによって示されるシステム・プロパティを取得します。

final var ret1 = System.getProperty("java.specification.version");
System.out.println(ret1); // 21

final var ret2 = System.getProperty("os.name");
System.out.println(ret2); // Windows 10

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()メソッドにより返されるものと同じ、指定されたオブジェクトのハッシュ・コードを返します。

final var list1 = new ArrayList<String>();
final var list2 = new ArrayList<String>();

list1.add("abc");
list2.add("abc");

System.out.println(list1 != list2); // true
System.out.println(list1.hashCode()); // 96385
System.out.println(list2.hashCode()); // 96385

System.out.println(System.identityHashCode(list1)); // 405896924
System.out.println(System.identityHashCode(list2)); // 1309335839

static Channel inheritedChannel ()

Java仮想マシンを作成したエンティティから継承されたチャネルを返します。

通常のアプリとして実行しても null が返ります。
インターネット・サービス・デーモン(inetd)経由だと、そのソケットを継承したチャンネルが返されるようです。

詳しくは、API仕様の SelectorProvider.inheritedChannel もご確認ください。

まだ動作を確認しきれていないため、コード例も準備できていません。
(いずれ更新するかもしれません…)

final var channel = System.inheritedChannel();
System.out.println(channel); // null

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 で実行した結果
// ↓
// [13, 10]

// Linux で実行した結果
// ↓
// [10]

static void load (String filename)

filename引数によって指定されたネイティブ・ライブラリをロードします。

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によって指定されるネイティブ・ライブラリをロードします。

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=R:\java-work\lib" JniMain

static String mapLibraryName (String libname)

ライブラリ名を、ネイティブ・ライブラリを表すプラットフォーム依存の文字列にマッピングします。

final var name = System.mapLibraryName("JniSample");
System.out.println(name);

// Windows で実行した結果
// ↓
// JniSample.dll

// Linux で実行した結果
// ↓
// libJniSample.so

static long nanoTime ()

実行中のJava仮想マシンの高精度時間ソースの現在値を、ナノ秒の単位で返します。

関連 : 経過時間の測定には System.nanoTime を使おう

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 + " sec."); // 1.003872 sec.

static void runFinalization ()

非推奨、削除予定: このAPI要素は将来のバージョンで削除予定です。 最終決定は削除のために非推奨になりました。

非推奨です。

static void setErr (PrintStream err)

「標準」エラー出力ストリームを割り当てし直します。

final var outputStream = new ByteArrayOutputStream();

System.setErr(new PrintStream(outputStream));
System.err.println("abcd");

System.out.println("outputStream : " + outputStream);

// 結果
// ↓
//outputStream : abcd

static void setIn (InputStream in)

「標準」入力ストリームを割り当てし直します。

final var bytes = "abcd\n".getBytes();

System.setIn(new ByteArrayInputStream(bytes));

final var scanner = new Scanner(System.in);
final var line = scanner.nextLine();

System.out.println(line); // abcd

static void setOut (PrintStream out)

「標準」出力ストリームを割り当てし直します。

final var outputStream = new ByteArrayOutputStream();

System.setOut(new PrintStream(outputStream));
System.out.println("abcd");

System.err.println("outputStream : " + outputStream);

// 結果
// ↓
//outputStream : abcd

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 : 21
//os.name : Windows 10
//...
//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要素は将来のバージョンで削除予定です。 このメソッドは、非推奨であり、今後のリリースで削除される可能性があります。「セキュリティ・マネージャ」と組み合わせて使用すると便利です。

非推奨です。


関連記事

ページの先頭へ