Propertiesファイルを作成するサンプル

java.util.Propertiesでpropertiesファイルを作成すると以下の2点が思ったようにできなかったので、Propertiesクラスを参考に実装してみました。
1.キーでソートしたい
2.\nをエスケープしたくない

  • code1(作成対象のkeyとvalueを指定)

サロゲートペア文字もkey3で確認

    private static Map<String, String> getKeyValMap() {
        Map<String, String> map = new TreeMap<>(); // <-- sort
        map.put("key1", "val1");
        map.put("key2", "val2あ"); // \u3042
        map.put("key3", "val3&#171581;"); // \uD867\uDE3D
        map.put("key4", "val4\n");
        map.put("key5", "val5ア"); // \u30A2
        return map;
    }
  • code2(propertiesファイルを出力)

・ファイル出力時には文字コードを指定、valueをユニコードエスケープ

    private static void createProp(Map<String, String> map, Path path) {
        try (BufferedWriter writer = Files.newBufferedWriter(path, Charset.forName("ISO-8859-1"));) {
            for (String key : map.keySet()) {
                String line = key + "=" + toHex(map.get(key));  // <-- code3
                writer.write(line);
                writer.newLine();
            }
        } catch (IOException ex) {
            Logger.getLogger(PropertiesSample.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  • code3(valueを「\uxxxx」形式に変換)
    private static String toHex(String val) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < val.length(); i++) {
            char c = val.charAt(i);
            if (!isEacapeTarget(c)){
                sb.append(c);
            } else {
                sb.append("\\u");
                sb.append(hexDigit[((c >> 12) & 0xF)]);
                sb.append(hexDigit[((c >> 8) & 0xF)]);
                sb.append(hexDigit[((c >> 4) & 0xF)]);
                sb.append(hexDigit[(c & 0xF)]);
            }
        }
        return sb.toString();
    }

    private static final char[] hexDigit = {
        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
    };
  • 実行結果(sample.properties)


全コードはここにおきました。
今回これだけの実装ですが、jdk内の実装を読むことでとても勉強になりました。^^;;;
まだまだ勉強していないことが、、、