比较 2 个或更多 .PROPERTIES 文件只比较键
COMPARE 2 or more .PROPERTIES files comparing ONLY keys
我想比较 2 个或更多(如果可能).properties 文件,完全是 i18n 文件。
所以我有默认的 messages_es.properties ,我首先在其中添加带有值的键,我真正需要的是仅将 default/primary messages_es.properties 的键与其他 .properties 文件进行比较,例如 messages_en.properties,了解哪些翻译留在不同的 .properties 文件中。
基本上:
- 输入:两个属性文件
- 输出:第二个 .properties 文件中缺少键
O/P 应该显示第二个 .properties 文件中缺少的键。
Class Properties
有方法
public synchronized void load(InputStream inStream)
public synchronized void load(Reader reader)
您可以使用它们来加载您的文件。
然后使用方法
public Set<String> stringPropertyNames()
获取一组属性。
终于Set
有了方法
boolean retainAll(Collection<?> c)
boolean removeAll(Collection<?> c)
以不同的方式工作。
例子(很简单)
String filename1 = args[0];
String filename2 = args[1];
try {
System.out.println("Load " + filename1);
Properties prop1 = loadProperties(filename1);
Properties prop2 = loadProperties(filename2);
Set<String> proprietes1 = prop1.stringPropertyNames();
Set<String> proprietes2 = prop2.stringPropertyNames();
proprietes1.removeAll(proprietes2);
System.out.println("Propriétés de " + filename1 + " qui ne sont pas dans " + filename2);
for (String prop : proprietes1) {
System.out.println(prop);
}
} catch (FileNotFoundException | IOException e) {
System.out.println(usage);
e.printStackTrace();
}
其中:
public static Properties loadProperties(String filename1) throws FileNotFoundException, IOException {
Properties prop = new Properties();
BufferedReader reader = new BufferedReader(new FileReader(filename1));
prop.load(reader);
return prop;
}
如果有人还在寻找答案,我实现了下面的代码
public class PropertiesCompare {
public static void main(String[] args) {
String propertiesFilename1 = System.getProperty("PropFile1");
String propertiesFilename2 = System.getProperty("PropFile2");
Map<String, String> PropFile1 = getProps(propertiesFilename1);
Map<String, String> PropFile2 = getProps(propertiesFilename2);
String missingProp = "";
for (Map.Entry<String, String> entry : PropFile1.entrySet()) {
if (PropFile2.containsKey(entry.getKey())) {
String PropFile2Value = (PropFile2.get(entry.getKey()));
String PropFile1Value = (entry.getValue());
if (!PropFile2Value.equalsIgnoreCase(PropFile1Value)) {
System.out.println("Key : "+entry.getKey()+"\t\nValue : PropFile1 = "+PropFile1Value+", PropFile2 = "+PropFile2Value);
}
} else {
missingProp= missingProp+(entry.getKey() + " = " + entry.getValue() + "\n");
}
}
}
public static Map<String, String> getProps(String propertiesFilename1) {
Map<String, String> properties = new HashMap<>();
try (InputStream stream = new FileInputStream(propertiesFilename1)) {
Properties prop = new Properties() {
@Override
public synchronized Object put(Object key, Object value) {
return properties.put(key.toString(), value.toString());
}
};
prop.load(stream);
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
}
我想比较 2 个或更多(如果可能).properties 文件,完全是 i18n 文件。 所以我有默认的 messages_es.properties ,我首先在其中添加带有值的键,我真正需要的是仅将 default/primary messages_es.properties 的键与其他 .properties 文件进行比较,例如 messages_en.properties,了解哪些翻译留在不同的 .properties 文件中。
基本上:
- 输入:两个属性文件
- 输出:第二个 .properties 文件中缺少键
O/P 应该显示第二个 .properties 文件中缺少的键。
Class Properties
有方法
public synchronized void load(InputStream inStream)
public synchronized void load(Reader reader)
您可以使用它们来加载您的文件。
然后使用方法
public Set<String> stringPropertyNames()
获取一组属性。
终于Set
有了方法
boolean retainAll(Collection<?> c)
boolean removeAll(Collection<?> c)
以不同的方式工作。
例子(很简单)
String filename1 = args[0];
String filename2 = args[1];
try {
System.out.println("Load " + filename1);
Properties prop1 = loadProperties(filename1);
Properties prop2 = loadProperties(filename2);
Set<String> proprietes1 = prop1.stringPropertyNames();
Set<String> proprietes2 = prop2.stringPropertyNames();
proprietes1.removeAll(proprietes2);
System.out.println("Propriétés de " + filename1 + " qui ne sont pas dans " + filename2);
for (String prop : proprietes1) {
System.out.println(prop);
}
} catch (FileNotFoundException | IOException e) {
System.out.println(usage);
e.printStackTrace();
}
其中:
public static Properties loadProperties(String filename1) throws FileNotFoundException, IOException {
Properties prop = new Properties();
BufferedReader reader = new BufferedReader(new FileReader(filename1));
prop.load(reader);
return prop;
}
如果有人还在寻找答案,我实现了下面的代码
public class PropertiesCompare {
public static void main(String[] args) {
String propertiesFilename1 = System.getProperty("PropFile1");
String propertiesFilename2 = System.getProperty("PropFile2");
Map<String, String> PropFile1 = getProps(propertiesFilename1);
Map<String, String> PropFile2 = getProps(propertiesFilename2);
String missingProp = "";
for (Map.Entry<String, String> entry : PropFile1.entrySet()) {
if (PropFile2.containsKey(entry.getKey())) {
String PropFile2Value = (PropFile2.get(entry.getKey()));
String PropFile1Value = (entry.getValue());
if (!PropFile2Value.equalsIgnoreCase(PropFile1Value)) {
System.out.println("Key : "+entry.getKey()+"\t\nValue : PropFile1 = "+PropFile1Value+", PropFile2 = "+PropFile2Value);
}
} else {
missingProp= missingProp+(entry.getKey() + " = " + entry.getValue() + "\n");
}
}
}
public static Map<String, String> getProps(String propertiesFilename1) {
Map<String, String> properties = new HashMap<>();
try (InputStream stream = new FileInputStream(propertiesFilename1)) {
Properties prop = new Properties() {
@Override
public synchronized Object put(Object key, Object value) {
return properties.put(key.toString(), value.toString());
}
};
prop.load(stream);
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
}