Чтение данных из ini-файла
Доброго времени суток!
Есть задача своим сервисом читать ini файл другого приложения, получать необходимый параметр из него, и дальше передавать его другим методам в виде String.
Возникла следующая проблема: если это делать через getProperty("Path"), то теряются наклонные черты \ и "съедается" ближайший конец строки.
Попробовал прочитать методом readLine() - и сначала было так же, но потом, когда я указал кодировку UTF-16, строчка стала выводиться корректно.
Мне кажется немного костыльным решением читать ini таким образом...
Подскажите, пожалуйста как можно исправить ситуацию в случае с использованием Properties?
И корректно ли было бы обрабатывать ini методами вроде readLine()? Или все же в первую очередь - Properties?
Код тестовой реализации:
package com.benderje.PCC;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
public class TEST {
public static void main(String[] args) {
try {
readLines(createReader());
readProps(createReader());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static void readLines(BufferedReader reader) throws IOException {
String line;
while ((line = reader.readLine()) != null){
if (line.startsWith("Path=")){
System.out.println(line.substring(5));
reader.close();
break;
}
}
}
private static void readProps(BufferedReader reader) throws IOException {
Properties properties = new Properties();
properties.load(reader);
System.out.println(properties.getProperty("Path"));
reader.close();
}
private static BufferedReader createReader() throws FileNotFoundException {
return new BufferedReader(
new InputStreamReader(
new FileInputStream("TestFile.ini"), StandardCharsets.UTF_16));
}
}
Вывод программы:
localhost:C:\DB\TestBase\
localhost:C:DBTTestBaseUser=SYSDBA
Фрагмент ini файла:
Path=localhost:C:\DB\TestBase\
User=UserLogin
Pass=$796....
DB=MAIN.GDB
Log=LOG.GDB
P.S. Notepad++ определяет кодировку, как UTF-16, символы конца строки везде рисует...
UPD
Как указал @XelaNimed в комментарии ниже, главная проблема вывода - для Properties необходимо экранировать слэши.
Т.к. мы не можем изменить этот ini, или как-то влиять на него, решено парсить файл в String.
UPD2 Поиски в интернете привели к выводу, что к проблемам с кодировками в Java могут привести такие моменты, как, например, среда, в которой запускается JVM. У нас клиенты работают как на winXP, так и на win10. Поэтому было решено добавить проверку кодировки "костылем":
В цикле перебираем кодировки (массив кодировок из StandartCharsets), читаем первую строку, проверяем в ней contains("известнаяНамСтрока"). Если совпало - setCharset() и brake, иначе перебираем дальше...
Насколько я понял, определение кодировки файла - отдельный головняк. Если кто-то знает, как он решается грамотно, буду рад ответу...
Ответы (1 шт):
String fileName="file:///C://temp//pro.properties";
List <String> res = Files.readAllLines(Path.of(new URI(fileName)));
res.forEach(System.out::println);