javaについて質問です。まったくわかりません…。

分かる方、ご協力お願いします。

javaファイルの中で使っている変数の値を他のファイル(テキストファイルorプロパティファイル?)
で<%= 変数 %>で読み込む。
さらにそのファイルの内容をjavaファイルに再読み込みする。

詳細はコメントに書きます。

回答の条件
  • 1人5回まで
  • 登録:2010/02/04 13:00:45
  • 終了:2010/02/06 23:23:43

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012010/02/04 17:33:10

ポイント1000pt

書き方は複数あるので、下記一例。

import java.lang.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

class textReplace {
    public static void main(String[] args) throws IOException {
        //
        // 変換用リスト読み込み(ファイル名は1番目の引数)
        BufferedReader br1 = new BufferedReader(new FileReader(args[0])); // ファイルストリーム準備
        Pattern ps1 = Pattern.compile("\\s*=\\s*"); // テキスト分割パターン生成
        Hashtable ht = new Hashtable(); // 変換リスト格納用連想配列
        String rs; // ファイル読み込み用
        while ((rs = br1.readLine()) != null) {
            String[] as = ps1.split(rs); // 分割
            if (as.length == 2) {
// System.out.print(as[0] + "=>" + as[1] + System.getProperty("line.separator")); // 動作テスト(取り出したデータの確認)
                ht.put((String)as[0], (String)as[1]); // 連想配列へ追加
            }
        }
// System.out.println(ht); // 動作テスト(連想配列の中身確認)
        //
        // 変換対象ファイルの読み込み(ファイル名は2番目の引数)
        BufferedReader br2 = new BufferedReader(new FileReader(args[1])); // ファイルストリーム準備
        Pattern ps2 = Pattern.compile("<%=\\s*(.+)\\s*%>"); // テキスト抽出パターン生成
        String ns; // 置換用文字列一時格納用
        StringBuffer sb = new StringBuffer();  // 置換作業用
        while ((rs = br2.readLine()) != null) {
            Matcher m = ps2.matcher((String)rs + ";"); // 抽出
            while (m.find()) { // 抽出されたものを1つ1つ処理
                if ((ns = (String)ht.get((String)m.group(1))) != null) { // 変換用リストの存在確認
                    m.appendReplacement(sb, ns);
                } else {
                    // 変換リストに無い場合の処理が必要ならココに書く
                }
            }
            m.appendTail(sb); // 残りの部分を補充
            sb.append(System.getProperty("line.separator")); // 改行コード追加
        }
        //
        // 変換対象ファイルへの書き込み(ファイル名は3番目の引数)
        PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(args[2]))); // 上書きモードで書き出し準備
        pw.println(sb); // ファイル出力
        pw.close(); // ファイル出力終了
    }
}

class呼び出し時の引数は3つにしてあります。(上書きなので、2つで良いのですが、

動作確認のため、読み込みと書き込みをバラバラに指定できるようにしてあります。)

java textReplace iniファイル 読み込み元ファイル 書き込み先ファイル

iniファイルの内容例

naiyo1 = 内容1
naiyo2= 内容2
naiyo3 =内容3

読み込み元ファイルの例

今日は<%=naiyo1%>についてお話します。
<%=naiyo2%>については次回の講座で取り扱います。
まずは前回の<%=naiyo3%>の復習から開始します。

変換されて書き込まれたファイルの例

今日は内容1についてお話します。;
内容2については次回の講座で取り扱います。;
まずは前回の内容3の復習から開始します。;

※ 軽い動作テストしか行ってません。

 動作テスト用と書いた部分の//を外して動かしたり、

 各コマンドについて調べたりで補完していただければと思います。

※末尾にセミコロンがついたままだったりしてますが、

 最終出力段階で置換して削るなどしてください。

id:Ryo0524

詳しいご回答ありがとうございます。

ファイル名はjavaファイルで直接指定したいのですが可能でしょうか?

また、iniファイルとされているのですが、javaファイルの変数を読み込みたいのですがそれは無理なのでしょうか?

2010/02/04 18:58:16
  • id:Ryo0524
    <詳細>

    javaファイルの中で使っている変数の値を他のファイル(テキストファイルorプロパティファイル?)
    で<%= 変数 %>で読み込む。
    さらにそのファイルの内容をjavaファイルに再読み込みする。

    例)
    main.javaファイル(一部抜粋)
    -----------------------------------------------------------
    String naiyo1 = "内容1";
    String naiyo2 = "内容2";
    String naiyo3 = "内容3";

    :
    :
    :

    mailBody = naiyo
    :
    :
    -----------------------------------------------------------

    main.txt(プロパティファイル?)
    -----------------------------------------------------------
    今日は<%=naiyo1%>についてお話します。
    <%=naiyo2%>については次回の講座で取り扱います。
    まずは前回の<%=naiyo3%>の復習から開始します。
    -----------------------------------------------------------

    main.javaのmailBody = naiyoの"内容"部分にmain.txtの内容を取り込む。
    このとき、<%=naiyo1%>には"内容1"、<%=naiyo2%>には内容2、<%=naiyo3%>には"内容3"
    が読み込まれている。
  • id:kn1967
    >※末尾にセミコロンがついたままだったりしてますが、
    > 最終出力段階で置換して削るなどしてください。

    テスト用のゴミが残ってました。下記の箇所を書き換えてください。
    × Matcher m = ps2.matcher((String)rs + ";"); // 抽出
    ○ Matcher m = ps2.matcher((String)rs); // 抽出
  • id:Ryo0524
    質問者です。

    質問内容を整理していて上記の書き方だとわかりにくいと思いましたので再度、書きます。


    main.txt(プロパティファイル?)の内容があります。
    -----------------------------------------------------------
    今日は<%=naiyo1%>についてお話します。
    <%=naiyo2%>については次回の講座で取り扱います。
    まずは前回の<%=naiyo3%>の復習から開始します。
    -----------------------------------------------------------

    このファイルを文字コード「MS932」に変換してmain.javaに読み込みます(改行もそのまま認識)
    main.java
    -----------------------------------------------------

    中略

    String naiyo1 = "配列について"
    String naiyo2 = "データ型について"
    String naiyo3 = "javaとは"


    中略

    mailBody = [main.txtの内容を取得]
    -----------------------------------------------------
    mailBodyを出力するとmain.txtの内容が出力される
    (<%=naiyo1%>、<%=naiyo2%>、<%=naiyo3%>に"配列について"、"データ型について"、"javaとは"をそれぞれ代入した値)

    <補足>
    読み込むファイル名はjavaファイル中で直接指定。(引数にはしない)
  • id:kn1967
    >ファイル名はjavaファイルで直接指定

    args[0]、args[1]、args[2] の部分に引数が入りますから、
    それぞれの部分を"ファイル名"に書き直せば対応可能です。

    >iniファイルとされているのですが、javaファイルの変数を読み込みたい

    「読み込みたい」ということで別ファイルにしておいたのですが、
    「java内に記述しておきたい」ということですね?

    (入れ替え1箇所目)
    // 変換用リスト読み込み から
    BufferedReader br2 = new BufferedReader(new FileReader(args[1])); // ファイルストリーム準備
    までを下記に入れ替えます。

    // 変換用リスト読み込み
    Hashtable ht = new Hashtable(); // 変換リスト格納用連想配列
    ht.put("naiyo1", "配列について");
    ht.put("naiyo2", "データ型について");
    ht.put("naiyo3", "javaとは");
    // 変換対象ファイルの読み込み
    String rs; // ファイル読み込み用
    BufferedReader br2 = new BufferedReader(new FileReader("main.txt")); // ファイルストリーム準備

    (入れ替え2箇所目)
    args[2] を "main.txt" に変えます。

    とりあえずの変更点は以上です。

    個別の変数にしてしまったり、文字コード変換が必要になったりと、なると、
    全体的焼き直しになりますので、ひとまず以上でご勘弁いただければと思います。
    (他の方の回答もお待ちになり、よりお求めの回答であれば、
     私への配分はゼロでもかまいません。)

    ※ 最後のコメント部分を書き直しました。
  • id:Ryo0524
    >kn1967さん

    詳しい回答ありがとうございます。
    最後に、ひとつだけ質問させてください。

    main.txtファイルはclassファイルと同じ場所におけばよいのですか?
  • id:kn1967
    ここまでの回答はあくまでも一例であり、他にも色々とあります。
    (文字コード等の問題も考えていかなければなりませんよね)
    短いやり取りで入れ込む技術が無く、中途半端で申し訳ないです。

    >main.txtファイルはclassファイルと同じ場所

    フルパス(c:¥hogehoge¥main.txt)で書けば別の場所にも置けます。
    相対パス(..¥main.txtなど)で書いても別の場所に置けます。
    単にファイル名だけ(main.txt)であればclassと同じ場所に置いて置いてください。


    ********** ここから別の話。**********


    お気づきかと思いますが、もうひとつの質問の方は、
    今回のコードを少し変えるだけで作れますが、別途記述しますか?
    記述する場合として、データの持ち方を、お考えのものに加え、
    下記のように3つ考えてみてますが、どれを採用します?

    (1)データを作る段階も含めて意外と面倒
    date.txt と title.properties に分ける
    (2)少し面倒だけど後々応用の利く方法
    date.txt(もしくはdate.properties??)の内容
    ---------------------------------
    title=株式会社○○○ 10月度メールマガジン
    naiyo<<<end
    以下略
    end
    ---------------------------------
    <<<end は end で始まる行まで連続で読み続けろという意味で使ってます。
    (3)一行目がtitleで二行目からが本文と決まっているならば、これが一番楽。
    ---------------------------------
    株式会社○○○ 10月度メールマガジン
    今月の特集は紅葉の名所特集です。
    今年は○○市では11月中旬が見ごろになるでしょう。
    そこで、○○市の紅葉スポットを調査してきました!!

    ○○公園
    ○○○川周辺
    ---------------------------------
    いかが?
  • id:Ryo0524
    >kn1967さん

    細かい説明まで本当にありがとうございます。
    ポイントは2つ分の質問相当と考えています。

    できれば(2)の方法でやりたいと考えています。
    どのようにソースを修正したらよいでしょうか?
  • id:kn1967
    回答についてですが、コメント欄に記述しても良いのですが、
    インデント等がなくなって、見づらいですし、
    本来別の質問なので、あちらの回答欄に記述したいと思ってます。
    (面倒と言った意味も判りやすいかと思って2と3の両方を作ってあります。)
     

    つきましては、
    あちらの質問の締め切りを一時解除していただけないでしょうか?
  • id:Ryo0524
    すみません。
    再開しました。

    よろしくお願いします。
  • id:kn1967
    再開ありがとうございます。コードを投稿させていただきました。

    なお、
    あちらの分のフォローについては、今後あちらのほうで行います。

    では、ひとまず失礼。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません