- 締切済み
起動した順に「1着です」「2着です」・・・と表示するプログラム
どうにも分からなくなってきたのでぜひ教えてください。 ---[やりたいこと]------------- (1)私のお客さんの部署には30人の社員がいます。 (2)彼らは一人一台ずつ Windows XP の PCを持っています。つまり、部署内に PCが30台あります。 (3)それら30台のPCは、あるフォルダをネットワーク共有して X:ドライブとして接続しています。 (4)その X:ドライブ に、私が作ったプログラム:例えば Test.java, Test.class を置いてあるとします。 (5)各マシンで java Test というコマンドを(バッチファイルで)実行します。 このプログラムを早く起動した順に 「あなたは1着です」「あなたは2着です」・・・「あなたは30着です」 と表示するプログラムを作りたいと思っています。 要するに、社員全員でプログラムを起動した順を分かるようにしたいのです。 ------------------------------ 今、考えている方法は、 (i) 共有フォルダに number.txt というファイルを置き、 number.txtには、現在までに起動した数を記録する。(最初は 0 を書き込んでおく) (ii) プログラムが起動すると number.txt から数字を読み込み、その数字に1を足して number.txt に書き込む というものです。 しかし、 ほぼ同時にプログラムを起動した社員が複数人いたとき、 ●「PC 1 で読み込み、PC 2 で読み込み、PC 1 で書き込み、PC 2 で書き込み」といったことが起こる可能性があります。この場合、PC 1 とPC 2 で表示される番号が一緒になってしまいます。 また、 ●起動が同時だと、片方のPCではファイルの読み込みができないのでは?という心配があります。 どうするのが良いでしょうか? ちなみに、現在、作ってみたのは以下のようなプログラムです。 よろしくお願いします。 -------------------------- import java.io.*; public class Test { public static void main(String[] args) { try { // FileInputStream, FileOutputStreamオブジェクトの生成 FileInputStream abc = new FileInputStream("number.txt"); FileOutputStream xyz = new FileOutputStream("number.txt"); // InputStreamReader, OutputStreamWriterオブジェクトの生成 InputStreamReader in = new InputStreamReader(abc, "Shift_JIS"); OutputStreamWriter out = new OutputStreamWriter(xyz, "Shift_JIS"); int number; // number = in.read(); number += 1; System.out.println("あなたは" + number + "着です") out.write(number); in.close(); out.close(); } catch(IOException e) { ; } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
これは要するに、Javaで排他的ファイルアクセスをするにはどうするか?という質問だろうか。 WindowsでJavaを使用する場合、FileInputStreamでは削除ロックが、FileOutputStreamでは削除・書き込みロックがかかるようになっている(これを継承したサブクラスも同じ)。したがって、FileOutputStreamで開いた場合ならば、何も考えずとも排他的アクセスになるはず。逆に、FileInputStreamでは削除ロックしかかからないため、FileInputStreamで開いてからFileOutputStreamで開くまでに時差がある場合、この間、他から排他的アクセスを受ける可能性はある。 あと、プログラムの問題点として、ファイルアクセス時に何らかの要因により例外が発生した場合、このままではcloseが実行されず、ファイルを占有したままになる可能性がないか?ということがある。たとえば、finallyにcloseをtryでくくって配置する、というように確実にファイルを開放する処理が必要だろうと思う。
- askaaska
- ベストアンサー率35% (1455/4149)
排他処理を考える必要があるわ。 逆を言うと排他して上げればできるわね。 つまり、 Aさんが number.txt にアクセスしているときは 他の人はそのファイルにアクセスできないようにしないといけないわ。 FileChannelというクラスがあるのでこれを使えばいいわよ。 注意点は、Aさんがアクセス中に他の人がどうするかね。 定期的に number.txt にアクセスを試みるようにするとか そこを考慮すれば解決が近いわ。 サーバに常駐アプリがおけるなら ServletにするとかRMIで解決するとかも ありだけど、とりあえずはこんな感じかな。
お礼
ありがとうございます。 排他的ファイルアクセスを勉強しないとダメですね。