[Java] システムプロパティのメモ


# 目的

- システムプロパティ関連のクラス・メソッドなどを整理

# システムプロパティの設定

JavaVM を起動する場合、コマンドライン引数に `-D` でシステムプロパティを、追加・変更することができます。

```
java -Dfile.encoding=UTF-8 -jar xxxx.jar
```

VMのバージョンやベンダーによっては違う方法で変更することができたり、あるいは変更できないシステムプロパティがある場合もありえます。

# Java プログラムからの操作

## 指定したキーの値を取得

<DL>
<DT>java.lang.System#getProperty(String key)
<DD>指定したキーの値（文字列）を取得します。
<DT>java.lang.System#getProperty(String key, String def)
<DD>指定したキーの値（文字列）を取得します。プロパティ値がない場合にはデフォルト値を返します。
<DT>java.lang.Integer#getInteger(String nm)
<DD>指定したキーの値（Integer）を取得します。
<DT>java.lang.Integer#getInteger(String nm, int val)
<DD>指定したキーの値（Integer）を取得します。プロパティ値がない場合にはデフォルト値を返します。
<DT>java.lang.Integer#getInteger(String nm, Integer val) 
<DD>指定したキーの値（Integer）を取得します。プロパティ値がない場合にはデフォルト値を返します。
<DT>java.lang.Booelan#getBoolean(String name)
<DD>指定したキーの値（boolean）を取得します。プロパティ値がない場合、"true" ではない場合には偽を返します。
</DL>

`Integer` や `Boolean` にシステムプロパティ取得メソッドがあるのは少し分かりにくいですね。

## キーと値の組を取得

<DL>
<DT>java.lang.System#getProperties()
<DD>Properties型 で取得。
<DT>java.lang.management.RuntimeMXBean#getSystemProperties()
<DD>Map&lt;String, String&gt; の形に詰め替えて取得。
</DL>

```java
		RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
		Map<String, String> systemProperties = runtimeMXBean.getSystemProperties();
```

## 値を変更

<DL>
<DT>java.lang.System#setProperty(String key, String value)
<DD>指定したキーの値を設定します。
<DT>java.lang.System#clearProperty(String key)
<DD>指定したキーの値を削除します。
<DT>java.lang.System#setProperties(Properties props)
<DD>システムプロパティを設定します。
</DL>

## システムプロパティを保護する

<DL>
<DT>java.util.PropertyPermission
<DD>システムプロパティのアクセス権を作成する。セキュリティマネージャなどで制御する場合に使います。
</DL>

# 一般的なシステムプロパティ

`java.lang.System#getProperties()` の Javadoc に一覧があります。それ以外にもいくつか使われているものがあります。

| キー | 対応する値の説明 | 参考値 [^1] |
|:--|:--|:--|
| java.version | Java Runtime Environmentのバージョン | 1.8.0_65 |
| java.vendor | Java Runtime Environmentのベンダー | Oracle Corporation  |
| java.vendor.url | JavaベンダーのURL | http://java.oracle.com/ |
| java.home | Javaのインストール先ディレクトリ | (省略) |
| java.vm.specification.version | Java仮想マシンの仕様バージョン | 1.8 |
| java.vm.specification.vendor | Java仮想マシンの仕様のベンダー | Oracle Corporation |
| java.vm.specification.name | Java仮想マシンの仕様名 | Java Virtual Machine Specification |
| java.vm.version | Java仮想マシンの実装バージョン |  25.65-b01 |
| java.vm.vendor | Java仮想マシンの実装のベンダー | Oracle Corporation |
| java.vm.name | Java仮想マシンの実装名 | Java HotSpot(TM) Client VM  |
| java.specification.version | Java Runtime Environmentの仕様バージョン | 1.8 |
| java.specification.vendor | Java Runtime Environmentの仕様のベンダー | Oracle Corporation |
| java.specification.name | Java Runtime Environmentの仕様名 | Java Platform API Specification |
| java.class.version | Javaクラスの形式のバージョン番号 | 52.0 |
| java.class.path | Javaクラス・パス | (省略) |
| java.library.path | ライブラリのロード時に検索するパスのリスト | (省略) |
| java.io.tmpdir | デフォルト一時ファイルのパス | (省略) |
| java.compiler | 使用するJITコンパイラの名前 |  |
| java.ext.dirs | 拡張ディレクトリのパス | (省略) |
| os.name | オペレーティング・システム名 | Windows 7 |
| os.arch | オペレーティング・システムのアーキテクチャ | x86 |
| os.version | オペレーティング・システムのバージョン | 6.1 |
| file.separator | ファイル区切り文字<br>* Windowsだとバックスラッシュ<br>* Unix/Linuxだとスラッシュ | \\ |
| path.separator | パス区切り文字<br>* Windowsだとセミコロン<br>* Unix/Linuxだとコロン | ; |
| line.separator | 行区切り文字<br>* Windowsだと\\r\\n<br>* Unix/Linuxだと\\nのみ | \\r\\n |
| user.name | ユーザーのアカウント名 | (省略) |
| user.home | ユーザーのホーム・ディレクトリ | (省略) |
| user.dir | ユーザーの現在の作業ディレクトリ | (省略) |
| file.encoding | ファイルの文字コード [^2]  |  |

## その他（一部抜粋）

- [ネットワークのプロパティ](https://docs.oracle.com/javase/jp/8/docs/api/java/net/doc-files/net-properties.html)
- [LogManagerクラス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/logging/LogManager.html)
- [SimpleFormatterクラス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/logging/SimpleFormatter.html)
- [MidiSystemクラス](https://docs.oracle.com/javase/jp/8/docs/api/javax/sound/midi/MidiSystem.html)
- [Currencyクラス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Currency.html)
- [SAXParserクラス](https://docs.oracle.com/javase/jp/8/docs/api/javax/xml/parsers/SAXParser.html)

## キー値を指定しないで取得できるメソッドおよびフィールド

`java.lang.System#getProperty(String key)` などでキー名を指定しなくても、一部のシステムプロパティを取得することができるメソッドやフィールドがあります。

| キー | 対応するメソッド・フィールド |
|:--|:--|
| java.vm.specification.version | java.lang.management.RuntimeMXBean#getSpecVersion() |
| java.vm.specification.vendor | java.lang.management.RuntimeMXBean#getSpecVendor() |
| java.vm.specification.name | java.lang.management.RuntimeMXBean#getSpecName() |
| java.vm.version | java.lang.management.RuntimeMXBean#getVmVersion() |
| java.vm.vendor | java.lang.management.RuntimeMXBean#getVmVendor() |
| java.vm.name | java.lang.management.RuntimeMXBean#getVmName() |
| java.class.path | java.lang.management.RuntimeMXBean#getClassPath() |
| java.library.path | java.lang.management.RuntimeMXBean#getLibraryPath() |
| os.name | java.lang.management.OperatingSystemMXBean#getName() |
| os.arch | java.lang.management.OperatingSystemMXBean#getArch() |
| os.version | java.lang.management.OperatingSystemMXBean#getVersion() |
| file.separator | java.io.File#separator, java.io.File#separatorChar |
| path.separator | java.io.File#pathSeparator, java.io.File#pathSeparatorChar |
| line.separator | java.lang.System#lineSeparator() |

[^1]: Windows7, OracleJava 8u65 の値
[^2]: System#getProperties() に記載なし