load(new FileReader())
メソッドを使用して、javaのPropertiesオブジェクトにプロパティをロードしようとしています。すべてのプロパティはロードされますが、プロパティはコメント付きのもの(#)で始まります。これらのコメント付きプロパティをJava APIを使用してPropertiesオブジェクトにロードする方法手動でのみ?JavaのPropertiesオブジェクトにコメント付きのプロパティをロード
ありがとうございました。
load(new FileReader())
メソッドを使用して、javaのPropertiesオブジェクトにプロパティをロードしようとしています。すべてのプロパティはロードされますが、プロパティはコメント付きのもの(#)で始まります。これらのコメント付きプロパティをJava APIを使用してPropertiesオブジェクトにロードする方法手動でのみ?JavaのPropertiesオブジェクトにコメント付きのプロパティをロード
ありがとうございました。
java.util.Properties
クラスを拡張してこの特殊性をオーバーライドすることを提案できますが、そのために設計されていません。多くのものはハードコードされており、上書きできません。そのため、ほとんど変更を加えずにメソッドのコピーペースト全体を行う必要があります。
if (isNewLine) {
isNewLine = false;
if (c == '#' || c == '!') {
isCommentLine = true;
continue;
}
}
#
がハードコードさ: はたとえば、一度に、内部で使用されるLineReaderは、ロード時にプロパティファイルことありません。
編集
もう一つの方法は、必要に応じてByteArrayOutputStream
で、修正、それは#
であれば最初の文字を削除し、読み取りラインを書き、行ごとにproprtiesファイルを読み取ることができます。 ByteArrayOutputStream.toByteArray()
からByteArrayInputStream
のプロパティを読み込むことができます。
ここユニットテストで可能な実装:ユニットテスト
dog=woof
#cat=meow
:入力myProp.properties
Asを
@Test
public void loadAllPropsIncludingCommented() throws Exception {
// check properties commented not retrieved
Properties properties = new Properties();
properties.load(LoadCommentedProp.class.getResourceAsStream("/myProp.properties"));
Assert.assertEquals("woof", properties.get("dog"));
Assert.assertNull(properties.get("cat"));
// action
BufferedReader bufferedIs = new BufferedReader(new FileReader(LoadCommentedProp.class.getResource("/myProp.properties").getFile()));
ByteArrayOutputStream out = new ByteArrayOutputStream();
String currentLine = null;
while ((currentLine = bufferedIs.readLine()) != null) {
currentLine = currentLine.replaceFirst("^(#)+", "");
out.write((currentLine + "\n").getBytes());
}
bufferedIs.close();
out.close();
// assertion
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
properties = new Properties();
properties.load(in);
Assert.assertEquals("woof", properties.get("dog"));
Assert.assertEquals("meow", properties.get("cat"));
}