WindowsとLinuxの両方で動作するコードを書くJavaTips 〜Javaプログラミング編

» 2005年01月25日 10時00分 公開
[小田原大@IT]

JavaはOS非依存?

 JavaのクラスファイルはOSに依存せず、Java仮想マシン上で動くことになっています。しかしJavaプログラムでOSに依存するプロパティを直接指定することもできるため、例えばLinux上でないと正しく動作しないJavaプログラムもあります。

 WindowsとLinuxを並行して開発するといった状況では、この辺りの事情を考慮する必要があります。本TIPSでは、JavaでOSのシステムプロパティを用いるためのjava.lang.SystemクラスのgetPropertyメソッドを紹介します。

System.getProperty
引数:String(システムプロパティ)
戻り値:String (システムプロパティの値)

 getPropertyメソッドによって、システムプロパティの値を知ることができます。システムプロパティとはクラスパスやOSの名前、javaのバージョンなどの環境の情報です。システムプロパティとその値が具体的にどういうものであるかを列挙して確認するには、例えばリスト1のようにします。

リスト1 システムプロパティの列挙
//import java.util.*; が必要
Properties p = System.getProperties();
for(Iterator i = p.keySet().iterator();i.hasNext();){
  String value = (String)i.next();
  System.out.println(value+"="+System.getProperty(value));
}
// p.list(System.out);だけでも同等の表示を行う


 実行例は省略しますが、os.name やjava.class.path、file.separator などのプロパティとその値が表示されます。

 ここで表示されたシステムプロパティについて、その値を直接指定するコードを書くと、異なるシステムプロパティの値を持つ別の環境ではそのクラスファイルはうまく動きません。これを避けるため、System.getPropertyを用いてシステムプロパティの値を得るようにします。

 OSの名前を得るにはgetProperty(“os.name”)とします。例えばリスト2は実行環境のOSによって実行処理を分岐するコードです。

リスト2 OSによって処理を変える
String osname = System.getProperty(“os.name”);
if(osname.indexOf(“Windows”)>=0){
  // Windowsであったときの処理
} else if(osname.indexOf(“Linux”)>=0){
  // Linuxであったときの処理
} else if(osname.indexOf(“Mac”)>=0){
  // MacOSであったときの処理
} else {
  // その他の環境だったときの処理
}


 ファイルシステムが異なる実行環境では、ファイルの区切り文字やディレクトリの指定の仕方が異なります。異なる環境に応じてパス名を正しく指定するには、例えばリスト3のようにします。

リスト3 異なる環境においてファイルのパスを指定する
System.getProperty(“user.home”)+File.separator+"hoge.txt"


 getPropertyでユーザーのホームディレクトリを指定するには、“user.home”というプロパティを引数にします。こうすることで、実行環境によって異なるファイル名がString型として返されます。

 さらにここではjava.io.Fileクラスのクラスフィールド“separator”も用いています。ファイルパスの区切り文字はシステムに依存します。Windowsでは“\”、LinuxなどUNIX系統のOSでは“/”が用いられています。File.separatorはこれらのシステム依存の値を表してくれます。ここのコードではリスト2のようにOSの名前を調べる手間を省けています。

実行結果(Windows)
C:\Documents and Settings\haradai\hoge.txt


実行結果(Linux)
/home/users/haradai/hoge.txt


Profile

WINGSプロジェクト

小田原大


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。