1

Java には、簡単にロードできるデータ ファイルを作成できる「ネイティブ」形式がありますMap<String, Collection<String>>か? 重要な解析をコード化する必要なく、むしろこれを行いたいと思います。これは、アプリケーション スコープの Bean を初期化するためのものであるため、起動時に 1 回だけ実行されます。

JSON を使用してから、GSON などを使用してデータをロードできることはわかっていますが、単純に見えるものに対してはやり過ぎのように思えます。クロージャーがあれば、それをプロパティ ファイルとして作成し、コレクションに特定のセパレーターを使用して、セパレーターでクロージャーを解析できる可能性がありますが、それはあまり洗練されていないように見えます。 8.

同様に、単純なプロパティ ファイルとして読み込んでから、個々のプロパティ値を解析する Map にコピーすることもできますが、これも少し「ハッキー」に思えます。

XML を使用してから XML をインポートすることもできますが、それはやり過ぎであり、簡単に理解できる単純なテキスト形式を使用することをお勧めします。

私は、Apache Commons や Guava などから何かを使用することに反対しているわけではありませんが、まだ簡単なものは見つけていません。

4

3 に答える 3

1

先頭のタブが特別な意味を持っていても問題ない場合は、ファイルを次のようにフォーマットすると思います。

key1
    value1-a
    value1-b
key2
    value2-a
key3
    value3-a
    value3-b
    value3-c

先頭のタブは、文字列が(キーではありません) であることを意味します。

次に、パーサー:

public class MapBuilder
{
    private final Map<String, Collection<String>> map;
    private Collection<String> col;

    public MapBuilder()
    {
        map = new LinkedHashMap<String, Collection<String>>();
    }

    public Map<String, Collection<String>> getMap()
    {
        return map;
    }

    public void addLine(String line)
    {
        if (line.length() > 0)
        {
            if (line.charAt(0) == '\t')
            {
                if (col == null)
                {
                    throw new IllegalArgumentException(
                            "No key specified");
                }
                col.add(line.substring(1));
            }
            else
            {
                col = new ArrayList<String>();
                map.put(line, col);
            }
        }
    }

    public static Map<String, Collection<String>> getMap(File file, 
            Charset charset) throws IOException
    {
        MapBuilder mb = new MapBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(file), charset));
        try
        {
            String line;
            while ((line = br.readLine()) != null)
            {
                mb.addLine(line);
            }
            return mb.getMap();
        }
        finally
        {
            try
            {
                br.close();
            }
            catch (Throwable t)
            {
                t.printStackTrace();
            }
        }
    }
}

使用法:

Map<String, Collection<String>> myMap = MapBuilder.getMap(
        new File("C:/myfile.txt"), Charset.forName("US-ASCII"));
于 2013-11-13T23:06:24.980 に答える
1

私の意見では、JSON は軽量でシンプルです。メモリ内表現はマップまたは配列のマップであり、仕事に適しているようです。これにより、ファイル全体がマルチマップに読み込まれます (Jackson を使用):

ObjectMapper mapper = new ObjectMapper();

Map<String, List<String>> map = mapper.readValue(inputStream,
     new TypeReference<Map<String, Object>>() {});
于 2013-11-13T16:32:49.307 に答える