3

私は RMI ゲームを構築しています。クライアントは、いくつかの異なるオブジェクトで使用されるいくつかのキーと値を持つファイルをロードします。ゲームのセーブファイルですが、java.util.Propertiesが使えません(仕様上)。ファイル全体を読んで、コメント行と一部のクラスに関係のないキーを無視する必要があります。これらのプロパティは一意ですが、任意の順序で並べ替えることができます。私のファイルの現在のファイルは次のようになります。

# Bio
playerOrigin=Newlands
playerClass=Warlock
# Armor
playerHelmet=empty
playerUpperArmor=armor900
playerBottomArmor=armor457
playerBoots=boot109
etc

これらのプロパティは、プレーヤーの進行状況に応じて書き込まれ、配置されます。ファイル リーダーは、ファイルの最後に到達し、一致したキーのみを取得する必要があります。私はさまざまなアプローチを試みましたが、これまでのところ、java.util.Properties を使用した結果に近いものはありませんでした。何か案が?

4

5 に答える 5

5

これにより、「プロパティ」ファイルが 1 行ずつ読み取られ、各入力行が解析され、値がキー/値マップに配置されます。マップ内の各キーは一意です (重複キーは許可されません)。

package samples;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.TreeMap;

public class ReadProperties {

    public static void main(String[] args) {
        try {
           TreeMap<String, String> map = getProperties("./sample.properties");
           System.out.println(map);
        }
        catch (IOException e) {
            // error using the file
        }
    }

    public static TreeMap<String, String> getProperties(String infile) throws IOException {
        final int lhs = 0;
        final int rhs = 1;

        TreeMap<String, String> map = new TreeMap<String, String>();
        BufferedReader  bfr = new BufferedReader(new FileReader(new File(infile)));

        String line;
        while ((line = bfr.readLine()) != null) {
            if (!line.startsWith("#") && !line.isEmpty()) {
                String[] pair = line.trim().split("=");
                map.put(pair[lhs].trim(), pair[rhs].trim());
            }
        }

        bfr.close();

        return(map);
    }
}

出力は次のようになります。

{playerBoots=boot109, playerBottomArmor=armor457, playerClass=Warlock, playerHelmet=empty, playerOrigin=Newlands, playerUpperArmor=armor900}

でマップの各要素にアクセスしますmap.get("key string");

編集: このコードは、不正な形式または欠落している "=" 文字列をチェックしません。ペア配列のサイズをチェックすることで、分割から戻ったときにそれを自分で追加できます。

于 2012-02-15T20:45:21.957 に答える
2

私は現在、それを提供するだけのフレームワークを思いつくことができません (ただし、たくさんあると確信しています) が、自分でそれを行うことができるはずです。

基本的には、ファイルを 1 行ずつ読み取り、最初の非空白文字がハッシュ ( #) であるか、行が空白のみであるかを確認するだけです。これらの行を無視して、他の行を分割しようとし=ます。このような分割で 2 つの文字列の配列を取得できない場合は、不正な形式のエントリがあり、それに応じて処理します。それ以外の場合、最初の配列要素がキーで、2 番目が値です。

于 2012-02-15T20:19:12.750 に答える
1

または、正規表現を使用してキーと値のペアを取得することもできます。

(?m)^[^#]([\w]+)=([\w]+)$

各キーとその値のキャプチャ グループを返し、コメント行を無視します。

編集:

これはもう少し簡単にすることができます:

[^#]([\w]+)=([\w]+)
于 2012-02-15T20:44:51.863 に答える
1

いくつかの研究の後、私はこの解決策を思いつきました:

public static String[] getUserIdentification(File file) throws IOException {
        String key[] = new String[3];
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String lines;
        try {
            while ((lines = br.readLine()) != null) {
                String[] value = lines.split("=");
                if (lines.startsWith("domain=") && key[0] == null) {
                    if (value.length <= 1) {
                        throw new IOException(
                                "Missing domain information");
                    } else {
                        key[0] = value[1];
                    }
                }

                if (lines.startsWith("user=") && key[1] == null) {
                    if (value.length <= 1) {
                        throw new IOException("Missing user information");
                    } else {
                        key[1] = value[1];
                    }
                }

                if (lines.startsWith("password=") && key[2] == null) {
                    if (value.length <= 1) {
                        throw new IOException("Missing password information");
                    } else {
                        key[2] = value[1];
                    }
                } else
                    continue;
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return key;
}

このコードを使用してプロパティを確認しています。もちろん、Properties ライブラリを使用する方が賢明ですが、残念ながら私にはできません。

于 2012-02-17T18:25:55.630 に答える