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𩸽"); // \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内の実装を読むことでとても勉強になりました。^^;;;
まだまだ勉強していないことが、、、