Посмотрел решения коллег по бедствию, все используют класс Properties с его стандартными методами. Я все же хочу реализовать самостоятельно. Вопрос, где у меня проблема. Вроде все, что по условию в статье в вики я учел. Но загрузка все равно глючит (
package com.javarush.task.task20.task2003;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Знакомство с properties
*/
public class Solution {
public static Map<String, String> properties = new HashMap<>();
public void fillInPropertiesMap() throws Exception {
//implement this method - реализуйте этот метод
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
FileInputStream is = new FileInputStream(br.readLine());
this.load(is);
is.close();
for (Map.Entry<String, String> p : properties.entrySet())
{
System.out.println(p.getKey() + " : " + p.getValue());
}
}
public void save(OutputStream outputStream) throws Exception {
//implement this method - реализуйте этот метод
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(outputStream));
for (Map.Entry<String, String> p : properties.entrySet())
{
String key = p.getKey().replace(" ", "\\ ");
String value = p.getValue().replace(System.lineSeparator(), "\\"+System.lineSeparator());
br.write(key + " : " + value + System.lineSeparator());
}
br.flush();
br.close();
}
public void load(InputStream inputStream) throws Exception {
//implement this method - реализуйте этот метод
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
Boolean nextpar = false;
String value = "";
String key = "";
while (br.ready())
{
String s = br.readLine();
// skip iteration
if (s.indexOf("#")==0||s.indexOf("!")==0)
continue;
if (!nextpar) {
if (s.indexOf(" : ")!= -1 || s.indexOf(" : ") < s.indexOf(" = ")) {
key = s.substring(0, s.indexOf(" : ")).replace("\\ ", " ");
value = s.substring(s.indexOf(" : ") + 3);
}
else
{
key = s.substring(0, s.indexOf(" = ")).replace("\\ ", " ");
value = s.substring(s.indexOf(" = ") + 3);
}
}
else
{
nextpar = false;
value += s;
}
Pattern p = Pattern.compile("\\\\$");
Matcher m = p.matcher(value);
while (m.find()) {
value = value.replace("\\", System.lineSeparator());
nextpar = true;
}
if (!nextpar)
properties.put(key, value);
}
br.close();
}
public static void main(String[] args) throws Exception {
Solution sol = new Solution();
sol.fillInPropertiesMap();
}
}