• 締切済み

起動した順に「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) {    ;   } }

みんなの回答

noname#94983
noname#94983
回答No.2

これは要するに、Javaで排他的ファイルアクセスをするにはどうするか?という質問だろうか。 WindowsでJavaを使用する場合、FileInputStreamでは削除ロックが、FileOutputStreamでは削除・書き込みロックがかかるようになっている(これを継承したサブクラスも同じ)。したがって、FileOutputStreamで開いた場合ならば、何も考えずとも排他的アクセスになるはず。逆に、FileInputStreamでは削除ロックしかかからないため、FileInputStreamで開いてからFileOutputStreamで開くまでに時差がある場合、この間、他から排他的アクセスを受ける可能性はある。 あと、プログラムの問題点として、ファイルアクセス時に何らかの要因により例外が発生した場合、このままではcloseが実行されず、ファイルを占有したままになる可能性がないか?ということがある。たとえば、finallyにcloseをtryでくくって配置する、というように確実にファイルを開放する処理が必要だろうと思う。

white-tiger
質問者

お礼

ありがとうございます。 排他的ファイルアクセスを勉強しないとダメですね。

全文を見る
すると、全ての回答が全文表示されます。
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

排他処理を考える必要があるわ。 逆を言うと排他して上げればできるわね。 つまり、 Aさんが number.txt にアクセスしているときは 他の人はそのファイルにアクセスできないようにしないといけないわ。 FileChannelというクラスがあるのでこれを使えばいいわよ。 注意点は、Aさんがアクセス中に他の人がどうするかね。 定期的に number.txt にアクセスを試みるようにするとか そこを考慮すれば解決が近いわ。 サーバに常駐アプリがおけるなら ServletにするとかRMIで解決するとかも ありだけど、とりあえずはこんな感じかな。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • UNICODEへの文字コード変換

    以下のようにして、 日本語で書かれたファイルを読み込んで、 UNICODEに変換したいのですが、 できません。。。 どこが間違っているのでしょうか?(;;) 元の日本語ファイル「こんにちは」 >>できたファイル「\u3053\u3093\u306b\u3061\u306f」 という風にしたいのですが。。 //FileIOSteramの作成 FileInputStream fis = new FileInputStream(iFile); FileOutputStream fos = new FileOutputStream(oFile); //Stream ラップ InputStreamReader in = new InputStreamReader(fis, "EUC-JP-LINUX"); OutputStreamWriter out = new OutputStreamWriter(fos, "UTF16"); System.out.println(System.getProperty("file.encoding")); //読み込みと書き込み int c; InputStreamReader in = new InputStreamReader(fis, "Unicode"); Writer out = new Writer(fos); while((c = in.read()) != -1){ out.write(c); }

  • ファイル書き込みに関して

    FileOutputStream fos = new FileOutputStream("test"); OutputStreamWriter out = new OutputStreamWriter(fos, "UTF-8"); out.write("なに"); out.close(); fos.close(); 以上のコードを実行させて、ファイルtestをUTF8で開いたら、文字化けしています。どう直したらいいですか?

    • ベストアンサー
    • Java
  • java utf-8 で ファイル出力

    【やりたい事】  ファイルを読み込んで、改行コードCRLFをLFに変換して、空白行は削除して、「正常終了しました。」は削除。  文字コードUTF8で出力したい。 【問題】  UTF-8で指定してるのに、Shift_JISで出力される。 【入力ファイル】  ファイル名:test.tsv  文字コード:UTF-8  改行コード:CRLF ************************ test test1 1 2 1 3 正常終了しました。 ************************ 【現在のソース】 import java.io.*; public class writeFile { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ try { //(1)FileReaderオブジェクトinFileを生成 FileReader inFile = new FileReader("test.tsv"); //(2)FileWriterオブジェクトoutFileを生成 FileWriter outFile = new FileWriter("test_lf.tsv"); //(3)BufferedReaderオブジェクトinBufferを生成 BufferedReader inBuffer = new BufferedReader(inFile); //(4)BufferedWriterオブジェクトoutBufferを生成 BufferedWriter outBuffer = new BufferedWriter(outFile); String line; int cnt=0; //(5)読み込みデータがなくなるまで、読み込み while ((line = inBuffer.readLine()) != null) { //(6)データの書き込み処理 if (line.equals("")){ cnt=cnt+1; }else{ if(cnt<=1){ outBuffer.write(line+"\n"); } } } outBuffer.flush(); //(7)バッファをフラッシュ inBuffer.close(); //(8)読み込みストリームのクローズ outBuffer.close(); //(9)書き込みストリームのクローズ } catch (IOException e) { } try { //(1) //(2)FileInputStreamオブジェクトの生成 FileInputStream abc = new FileInputStream("test_lf.tsv"); //(3)FileOutputStreamオブジェクトの生成 FileOutputStream xyz = new FileOutputStream("test_lf_utf.tsv"); //(4)InputStreamReaderオブジェクトの生成 InputStreamReader in = new InputStreamReader(abc, "Shift_JIS"); //(5)OutputStreamWriterオブジェクトの生成 OutputStreamWriter out = new OutputStreamWriter(xyz, "UTF-8"); int contents; //(6) //(7)読み込むデータがなくなるまで読み込み while ((contents = in.read()) != -1) { //(8)書き込むデータがなくなるまで書き込み out.write(contents); } in.close(); //(9)読み込みストリームを閉じる out.close(); //(10)書き込みストリームを閉じる } catch(IOException e) { } } } 【出力結果】  ファイル名:test_lf.tsv  文字コード:Shift_JIS  改行コード:LF ************************  test test1 1 2 1 3 ************************  ファイル名:test_lf_utf.tsv  文字コード:Shift_JIS  改行コード:LF ************************ test test1 1 2 1 3 ************************ 本当に困っています。 もう二日、はまってます。 ご教授願います。

    • ベストアンサー
    • Java
  • クラスの継承について

    現在JAVAの勉強をエクリプスの環境で行っています。 クラス等の勉強を行っているのですが 下記のメインソースで、UTF8のテキストデータを1行ずつ読み込んで 書き込むように設定しております。 import java.io.*; class streamTest5{ public static void main(String[] args) { try { //(1) String str; //(2)FileInputStreamオブジェクトの生成 FileInputStream test_in = new FileInputStream ("c:\\tmp\\UTF8\\src\\test_in.txt"); //(3)FileOutputStreamオブジェクトの生成 FileOutputStream test_out = new FileOutputStream ("c:\\tmp\\UTF8\\src\\test_out.txt"); //(4)InputStreamReaderオブジェクトの生成 InputStreamReader in = new InputStreamReader(test_in, "UTF-8"); BufferedReader in_b = new BufferedReader(in); //(5)バッファで1行ずつ読み込む //(6)OutputStreamWriterオブジェクトの生成 OutputStreamWriter out = new OutputStreamWriter(test_out, "UTF-8"); BufferedWriter out_b = new BufferedWriter(out); //(7)バッファで1行ずつ書き込む //int contents; //(6) //(8)読み込むデータがなくなるまで読み込み // while ((contents = in.read()) != -1) { //(9)書き込むデータがなくなるまで書き込み // out.write(contents); //} while((str = in_b.readLine()) != null) { out_b.write(str); out_b.newLine(); } //(10)nullまでループさせる in_b.close(); //(11)バッファ読み込みを閉じる out_b.close();//(12)バッファ書き込みを閉じる in.close(); //(13)読み込みストリームを閉じる out.close(); //(14)書き込みストリームを閉じる } catch(IOException e) { } } } 次に子クラスで、まだ手探りというか途中段階なのですが 読み込むテストテキストデータに合わせて作成中です。 実際行いたい、イメージが 13セル(フィールド)ある100件のデータベースを UTF8で読み込んで 例えばedit0でからedit5までのフィールドで 最終件数までループさせ 郵便番号・住所漢字・氏名漢字・抽出年月日・予備等を抽出して 最終的にはEditごとにプログラム開発を行いたいのですが クラスの継承が参考書等を見て色々と作業しているのですが 分からずつまずいています。 現在の下記のソースは不足しているのはもちろんのこと 余計なものも あると思いますし 途中段階です。 このようなソースの場合、どのようなとこから 継承させるのがポイントになるのでしょうか?? アドバイスいただけると助かります。 ちなみにEditごとの中身はシステムアウトで確認できる ソースしか書いてません。 情報や、説明不足もあると思いますので ご指摘いただければと思います。 また作業するには早いのかもしれませんが すこしでも手がかりがあると それについて勉強できるかと思い ご質問しました。 すいませんがどうぞよろしくお願いいたします。 public class tmp_1 extends streamTest5 { private tmp_1(String[] args) { ThisTest test = new ThisTest(); test.Edit0(); test.Edit1(); test.Edit2(); test.Edit3(); test.Edit4(); { //for ( int i = 0; i < field.length; ++i ) { // field[i] = "データ_" + i;} } } public class ThisTest{ String[] inData = new String[13];{ inData[0] = "基礎年金番号"; inData[1] = "年金コード"; inData[2] = "氏名カナ"; inData[3] = "氏名漢字"; inData[4] = "郵便番号"; inData[5] = "住所カナ"; inData[6] = "住所漢字"; inData[7] = "住民票収録状況表示"; inData[8] = "住所突合結果コード"; inData[9] = "住民票住所漢字"; inData[10] = "抽出年月日"; inData[11] = "基礎年金番号"; inData[12] = "予備"; } void Edit0() { System.out.println(String.format(("*") + inData[0] + "*")); ///System.out.println(this.field11 + "予備"); } void Edit1() { System.out.println(inData[11]); //System.out.println(this.field11 + "予備"); } void Edit2() { System.out.println(inData[2]); } void Edit3() { System.out.println(inData[7]); } void Edit4() { System.out.println(inData[7]); } }}

    • ベストアンサー
    • Java
  • JAVAでのShift-JISとEUC-JP間の文字コード変換ができません

    Windows環境で作成した「Shift-JIS(CP932)」のファイルを、 JAVAを使用して「EUC-JP」のファイルに変換したいのですが、 NEC選定文字(13区)等の追加された機種依存文字の変換ができません。 いろいろ調べてみたのですが、 文字コードの呼び方がサイトによってあいまいで、 どのページが正しいのかがわかりません。 ・「Shift-JIS(CP932)」「EUC-JP」の正確な情報が記述されたサイト ・JAVAにおける文字コードの変換のノウハウ に関しての知識をお持ちの方がいましたら、教えてください。 以下は変換に使用したJAVAのソースコードです。 InputStreamReader ins = new InputStreamReader(new FileInputStream(iFile), "windows-31j"); OutputStreamWriter outs = new OutputStreamWriter(new FileOutputStream(oFile), "euc-jp"); int c; while ((c = in.read()) != -1) { out.write(c); } 以上です。 よろしくお願いします。

    • ベストアンサー
    • Java
  • StringTokenizerについて

    ファイルの読み込みをStringTokenizerを使ってやりたいのですが、 使い方がいまいち理解できません。今自分で作っているプログラムでは効率が悪いです。 プログラムの一部を載せるのでアドバイスお願いします。 <プログラム> InputStreamReader fisr = new InputStreamReader(client. getInputStream()); BufferedReader fin = new BufferedReader(fisr); String name = fin.readLine(); System.out.println(name); while(n!=10){ FileInputStream objFis = new FileInputStream("eitango"+rand[n]+".txt"); InputStreamReader objlsr = new InputStreamReader(objFis,"Shift_jis"); BufferedReader objBr = new BufferedReader(objlsr); PrintWriter out = new PrintWriter(client.getOutputStream(),true); //1行ずつファイルを読み込む if (n==0){ out.println("Hello,clientNo:" + number +"\n"); } for(a=0;a!=6;a++){ if(a==5){ String ans = objBr.readLine(); ans2 = ans.length(); System.out.println("ans2 = "+ans2); } if(a!=5){ out.println(objBr.readLine()); } }

    • ベストアンサー
    • Java
  • javaについて>IEのクッキーを使いたい

    IEでログインした状態であれば、ヤフーメールなどクッキーを使うHPにアクセスできるかと思ったのですがアクセスできません。どうすればよいでしょうか? 多分、javaはIEのクッキーを利用していないのですよね・・・ 何とか、IEのクッキーを利用できれば良いのですが。何か、良いお知恵はありませんでしょうか? 宜しくお願い致します。 以下、コードです。 ーーーーーーーーーーーーーーーーーーーーーーー import java.io.*; import java.net.*; class Test { static String input() throws IOException { InputStream is = new FileInputStream("url.txt");//urlを入力 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String str = br.readLine(); return(str); } static void read(String str) throws IOException { OutputStream os = new FileOutputStream("log.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); URL url = new URL(str); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); for (;;) { String i = in.readLine(); if(i == null) { break; } System.out.println(i + "\n"); fr.write(i + "\n"); } in.close(); fr.close(); } public static void main(String[] args) throws IOException { Test brow = new Test(); brow.read(brow.input()); } }

    • ベストアンサー
    • Java
  • 携帯用Java CLDC1.1でファイルのロードとセーブ

    <環境> IDE:NetBeans 6.1 CLDC 1.1 MIDP 2.0 携帯上でのファイルのロード、セーブの仕方が分かりません。 FileReaderやBufferedReaderがないのでやりかたが分かりません。一応Connectorを使って、こんな感じになりました。 ファイルのロード try { InputStreamReader in = new InputStreamReader   (Connector.openInputStream("C:\\data.txt")); (略) // ここにあるin を使ったメソッドは省略 in.close(); } catch (Exception e) { System.out.println(e); } ファイルのセーブ try { OutputStreamWriter out = new OutputStreamWriter (Connector.openOutputStream("C:\\data.txt")); (略) // ここにあるout を使ったメソッドは省略 out.close(); } catch (Exception e) { System.out.println(e); } どちらもClassNotFoundExceptionとConnectionNotFoundExceptionを返してしまいます。何故なんでしょう?ファイルパスが間違っているようなのですが、Cドライブにたしかにdata.txtは存在しています。 非常に困っています。

  • この各行のプログラムの意味を教えてください!

    各行のプログラムがなにをしてるかちょっとわからないので誰か教えてください><お願いします! PrintWriter out=new PrintWriter(socket.getOutStream(),true); out.println("hello,World!"); BufferedReader in=new BufferedReader( new InputStreamReader(socket.getInputStream()); String result=in.readLine();

    • ベストアンサー
    • Java
  • ファイル出力クラスの選択について(Java)

    少し長文になります。 Javaで、複数のオブジェクトに格納された文字列をループでgetして、 1つのファイル(test.txt)内に出力していくプログラムを作っています。 ファイル出力する際に使用可能なクラスがいくつもあるため、 どれを選択すればいいのか迷ってます。 以下の条件から、使用すべきクラスを教えて下さい! <ファイル出力の条件> ーーーーーーーーーーーーーー 1. ファイル(test.txt)は毎回新規で1ファイルのみ作成して、   そのファイル内にオブジェクトからループでgetした文字列を1行ずつ出力していく。   (次回実行の直前に、前回のtest.txtは手動削除する。) 2. test.txt内には日本語が出力される可能性があり、且つ、   test.txtをWindowsのアプリケーションで利用するため、   SJISにエンコードして出力する。   ※Javaの実行環境はLinux 3. バッファを使って出力する。 ーーーーーーーーーーーーーー 以上です。 私の考えでは、全てキャラクタストリームを使って、 ---------- FIleWriter fw = new FileWriter("test.txt",true);  OutputStreamWriter osw = new OutputStreamWriter(fw,"SJIS"); BufferedWriter bw = new BufferedWriter(osw); ---------- でいいのかなと思ったのですが、 ネットを見ていると ---------- FileOutputStream os = new FileOutputStream("output"); OutputStreamWriter osw = new OutputStreamWriter(os, "JIS"); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw); ---------- という記述もあり、 わざわざキャラクタストリームとバイトストリーム(FileOutputStream)を混ぜて使っている意図もよく分かりません。 (文字列を扱うのに、バイトストリームを使う意味って無いですよね??) それから、私の例では FIleWriterインスタンス生成時の引数で"true"を指定して test.txtに"追記"するように設定してますが、 test.txt自体は毎回新規作成のものを使うので、この場合trueもfalseも不要でしょうか?? (→認識の確認として、 「trueやfalseはあくまで既存ファイルに対しての追記/上書きの設定であって、 ファイルをオープンしてクローズするまでの間はtrueなど設定しなくても ずっと末尾に追記されていく」という認識でOK?) また、true/falseが不要な場合、 FIleWriterは使わずに、 ---------- OutputStreamWriter osw = new OutputStreamWriter("test.txt","SJIS"); BufferedWriter bw = new BufferedWriter(osw); ---------- としても問題無いでしょうか?? 以上、分かる方、アドバイスください!

    • ベストアンサー
    • Java