В некоторых ответах предполагается, что свойства, считанные из файла, помещаются в экземпляр Properties
(с помощью вызовов put
), чтобы отобразить их в файле. Хотя в целом так и происходит, я не вижу никакой гарантии для такого заказа.
ИМХО: лучше читать файл построчно (чтобы порядок был гарантирован), чем использовать класс Properties просто как парсер одного свойства
и, наконец, сохраните его в некоторой упорядоченной коллекции, например LinkedHashMap
.
Это может быть достигнуто следующим образом:
private LinkedHashMap<String, String> readPropertiesInOrderFrom(InputStream propertiesFileInputStream)
throws IOException {
if (propertiesFileInputStream == null) {
return new LinkedHashMap(0);
}
LinkedHashMap<String, String> orderedProperties = new LinkedHashMap<String, String>();
final Properties properties = new Properties(); // use only as a parser
final BufferedReader reader = new BufferedReader(new InputStreamReader(propertiesFileInputStream));
String rawLine = reader.readLine();
while (rawLine != null) {
final ByteArrayInputStream lineStream = new ByteArrayInputStream(rawLine.getBytes("ISO-8859-1"));
properties.load(lineStream); // load only one line, so there is no problem with mixing the order in which "put" method is called
final Enumeration<?> propertyNames = properties.<String>propertyNames();
if (propertyNames.hasMoreElements()) { // need to check because there can be empty or not parsable line for example
final String parsedKey = (String) propertyNames.nextElement();
final String parsedValue = properties.getProperty(parsedKey);
orderedProperties.put(parsedKey, parsedValue);
properties.clear(); // make sure next iteration of while loop does not access current property
}
rawLine = reader.readLine();
}
return orderedProperties;
}
Просто обратите внимание, что приведенный выше метод требует InputStream
, который впоследствии следует закрыть (конечно, нет проблем переписать его, чтобы в качестве аргумента использовался только файл).