Javaの利点の一つにOSを選ばずに実行できるという特徴があります。実行ファイルである拡張子がclassのファイルは実行されるときにjavaコマンドの引数として渡されます。Test.classを実行するには以下のようなコマンドになります。
java Test
このときjavaというコマンドはそれぞれのOSに沿った形でこのTest.classファイルを可能な限り同じように実行します。とはいえ同じにはできないものもあります。
MacとWindowsの違い
例えばMacとwindowsの間で一番目立つ違いはファイルのパスです。Macは/から始まるパスになっていますがWindowsはC:\\またはC:¥¥というドライブ名から始まるパスになっています。ファイルの書き出しの時に同じ場所を指定するのはできません。これはファイルの指定方法についてはMacとWindowsで処理を分けなければならないことを意味しています。ここでは実行しているJavaプログラムが自分はMacとWindowsのどちらのOSで動いているかを判別できる方法について書きます。
何を元に判別するか
Javaは実行時にシステムの情報を持っています。以下のコードを実行してください。
java.util.Properties p = System.getProperties(); for(Object key:p.keySet()){ System.out.println(key + ":" + p.getProperty(key.toString())); }
このPropertiesというクラスはキーと値の組み合わせを持つクラスです。keySetというメソッドによりキーのセットを全て取得できます。あとはそれを標準出力に出力していきます。たくさんの行が出力されたと思います。
java.runtime.name:Java(TM) SE Runtime Environment sun.boot.library.path:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib java.vm.version:25.102-b14 user.country.format:JP gopherProxySet:false (以下略)
OSやJavaの情報を持っています。以下のような出力があるので注目してください。
os.name:Mac OS X
これはMacで実行したものですがWindowsであれば
os.name:Windows 7
のように出力されるはずです。これを使ってOSを見分けるプログラムを書きます。
実装をする
os.nameというキーを取得するにはPropertiesクラス経由ではなく以下のように取得できます。
System.getProperty("os.name")
これを使って実装します。
public class SystemUtil { public static boolean isMac() { return System.getProperty("os.name").toLowerCase().startsWith("mac"); } public static boolean isWindows() { return System.getProperty("os.name").toLowerCase().startsWith("windows"); } public static void main(String[] args) { if (isMac()) { System.out.println("このOSはMacです。"); } else if (isWindows()) { System.out.println("このOSはWindowsです。"); } else { System.out.println("このOSは予想していませんでした。(" + System.getProperty("os.name") + ")"); } } }
MacでもWindowsでもないものはelse節にきて情報を出力するようにしています。実行結果はOSによって異なります。